C++ opengl中两个四边形相交白线的去除

C++ opengl中两个四边形相交白线的去除,c++,opengl,C++,Opengl,我正在制作一个用户从里向外看的盒子,一个天空盒子或者类似的东西。我用6个四边形创建了一个立方体,然后把理论相机放在立方体里,用图像对立方体进行纹理处理。用户可以使用鼠标环顾四周,立方体旋转,好像有人在移动他们的头。我遇到了一个问题,在两条边的交叉处出现了一条白线,我试着在保持实际四边形大小不变的情况下拉入四边形。我已经确定了清晰的颜色是黑色,我仍然得到了白线 以下是我设置的属性: glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST)

我正在制作一个用户从里向外看的盒子,一个天空盒子或者类似的东西。我用6个四边形创建了一个立方体,然后把理论相机放在立方体里,用图像对立方体进行纹理处理。用户可以使用鼠标环顾四周,立方体旋转,好像有人在移动他们的头。我遇到了一个问题,在两条边的交叉处出现了一条白线,我试着在保持实际四边形大小不变的情况下拉入四边形。我已经确定了清晰的颜色是黑色,我仍然得到了白线

以下是我设置的属性:

glClearColor(0.0, 0.0, 0.0, 0.0); 
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT);

glClearDepth(1);
//S is the side length of the cube
float s = 5;
glShadeModel(GL_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glHint(GL_POLYGON_SMOOTH, GL_NICEST);

glEnable(GL_POLYGON_SMOOTH);

glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
以下是创建多维数据集的代码:

float s = 5; //S is the side length of each quad
glNewList(m_cube, GL_COMPILE);
    {
        glPushMatrix();
        {
            glEnable(GL_TEXTURE_2D);

            glPushMatrix();
            {

                glBegin(GL_QUADS);
                {

                    //front
                    {
                        glTexCoord2f(0.5f, (1.0f / 3.0f));
                        //       glColor3f(1, 0, 0);
                        glVertex3f(((s / 2.0f)), ((s / 2.0f)),
                                   -((s / 2.0f))); //1

                        glTexCoord2f(0.25f, (1.0f / 3.0f));
                        //       glColor3f(1, 1, 0);
                        glVertex3f(-((s / 2.0f)), ((s / 2.0f)),
                                   -((s / 2.0f))); //2
                        glTexCoord2f(0.25f, (2.0f / 3.0f));
                        //       glColor3f(1, 0, 1);
                        glVertex3f(-((s / 2.0f)), -((s / 2.0f)),
                                   -((s / 2.0f))); //3
                        glTexCoord2f(0.5f, (2.0f / 3.0f));
                        //       glColor3f(1, 1, 1);
                        glVertex3f(((s / 2.0f)), -((s / 2.0f)),
                                   -((s / 2.0f))); //4
                    }

                    //left
                    {
                        glTexCoord2f(0.25f, (1.0f / 3.0f));
                        //       glColor3f(1, 0, 0);
                        glVertex3f(-((s / 2.0f)), ((s / 2.0f)),
                                   -((s / 2.0f))); //2
                        glTexCoord2f(0.0f, (1.0f / 3.0f));
                        //       glColor3f(1, 1, 0);
                        glVertex3f(-((s / 2.0f)), ((s / 2.0f)),
                                   ((s / 2.0f))); //5
                        glTexCoord2f(0.0f, (2.0f / 3.0f));
                        //       glColor3f(1, 0, 1);
                        glVertex3f(-((s / 2.0f)), -((s / 2.0f)),
                                   ((s / 2.0f))); //6
                        glTexCoord2f(0.25f, (2.0f / 3.0f));
                        //       glColor3f(1, 1, 1);
                        glVertex3f(-((s / 2.0f)), -((s / 2.0f)),
                                   -((s / 2.0f))); //3
                    }

                    //right
                    {
                        glTexCoord2f(0.75f, (1.0f / 3.0f));
                        //       glColor3f(1, 0, 0);
                        glVertex3f(((s / 2.0f)), ((s / 2.0f)),
                                   ((s / 2.0f))); //7
                        glTexCoord2f(0.5f, (1.0f / 3.0f));
                        //       glColor3f(1, 1, 0);
                        glVertex3f(((s / 2.0f)), ((s / 2.0f)),
                                   -((s / 2.0f))); //1
                        glTexCoord2f(0.5f, (2.0f / 3.0f));
                        //       glColor3f(1, 0, 1);
                        glVertex3f(((s / 2.0f)), -((s / 2.0f)),
                                   -((s / 2.0f))); //4
                        glTexCoord2f(0.75f, (2.0f / 3.0f));
                        //       glColor3f(1, 1, 1);
                        glVertex3f(((s / 2.0f)), -((s / 2.0f)),
                                   ((s / 2.0f))); //8
                    }

                    //back
                    {
                        glTexCoord2f(1.0f, (1.0f / 3.0f));
                        //       glColor3f(1, 0, 0);
                        glVertex3f(-((s / 2.0f)), ((s / 2.0f)),
                                   ((s / 2.0f))); //5
                        glTexCoord2f(0.75f, (1.0f / 3.0f));
                        //       glColor3f(1, 1, 0);
                        glVertex3f(((s / 2.0f)), ((s / 2.0f)),
                                   ((s / 2.0f))); //7
                        glTexCoord2f(0.75f, (2.0f / 3.0f));
                        //       glColor3f(1, 0, 1);
                        glVertex3f(((s / 2.0f)), -((s / 2.0f)),
                                   ((s / 2.0f))); //8
                        glTexCoord2f(1.0f, (2.0f / 3.0f));
                        //       glColor3f(1, 1, 1);
                        glVertex3f(-((s / 2.0f)), -((s / 2.0f)),
                                   ((s / 2.0f))); //6
                    }

                    //top
                    {
                        glTexCoord2f(.5f, 1.0f);
                        //       glColor3f(1, 0, 0);
                        glVertex3f(((s / 2.0f)), -((s / 2.0f)),
                                   ((s / 2.0f))); //7
                        glTexCoord2f(0.25f, 1.0f);
                        //       glColor3f(1, 1, 0);
                        glVertex3f(-((s / 2.0f)), -((s / 2.0f)),
                                   ((s / 2.0f))); //5
                        glTexCoord2f(0.25f, (2.0f / 3.0f));
                        //       glColor3f(1, 0, 1);
                        glVertex3f(-((s / 2.0f)), -((s / 2.0f)),
                                   -((s / 2.0f))); //2
                        glTexCoord2f(.5f, (2.0f / 3.0f));
                        //       glColor3f(1, 1, 1);
                        glVertex3f(((s / 2.0f)), -((s / 2.0f)),
                                   -((s / 2.0f))); //1
                    }

                    //bottom
                    {
                        glTexCoord2f(.5f, (1.0f / 3.0f));
                        //       glColor3f(1, 0, 0);
                        glVertex3f(((s / 2.0f)), ((s / 2.0f)),
                                   -((s / 2.0f))); //4
                        glTexCoord2f(0.25f, (1.0f / 3.0f));
                        //       glColor3f(1, 1, 0);
                        glVertex3f(-((s / 2.0f)), ((s / 2.0f)),
                                   -((s / 2.0f))); //3
                        glTexCoord2f(0.25f, 0.0f);
                        //       glColor3f(1, 0, 1);
                        glVertex3f(-((s / 2.0f)), ((s / 2.0f)),
                                   ((s / 2.0f))); //6
                        glTexCoord2f(.5f, 0.0f);
                        //       glColor3f(1, 1, 1);
                        glVertex3f(((s / 2.0f)), ((s / 2.0f)),
                                   ((s / 2.0f))); //8
                    }

                }
                glEnd();

            }
            glPopMatrix();
            glDisable(GL_TEXTURE_2D);
        }
        glPopMatrix();
    }
    glEndList();
以下是设置camara的代码:

float near_ = 1f;
float far_ = 10.0f;

float halfHeight = near_ * (Radian(m_fov)) / 2.0f;
float halfWidth = (static_cast<float>((m_width)) / static_cast<float>((m_height))) * halfHeight;
glViewport(0, 0, m_width, m_height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glFrustum(-halfWidth, halfWidth, -halfHeight, halfHeight, near_, far_);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
下面是正在发生的事情的屏幕截图,请注意蓝色和黑色四边形之间的白线:

这是我使用的纹理,分辨率为600x450,但线条以多种分辨率出现:

我的问题是:我如何摆脱那条白线

编辑:白线仅出现在顶部和底部与左侧和右侧相交的位置


编辑:更新代码以反映建议

我无法在注释部分为您提供此图片,因此,您能否增加四边形长度,同时使其保持与此图片中相同的平面高度

GPU中的浮点精度是多少

float near_ = 0.00000001f; 
所以你已经试过了:

你在用什么

假设:您的虚线可能来自


Z-buffer是三维渲染中的一种现象,当两个或多个基本体在Z-buffer中具有相似的值时会发生这种现象。这在共面多边形中尤其普遍,在共面多边形中,两个面基本上占据相同的空间,前面两个面都没有。受影响的像素使用任意一个多边形或另一个多边形的碎片进行渲染,渲染方式由z-buffer的精度决定。它也可以随着场景或摄影机的更改而变化,导致一个多边形“赢得”z测试,然后是另一个多边形,依此类推。整体效果是两个多边形的闪烁、嘈杂的光栅化,这两个多边形“斗争”为屏幕像素上色。这个问题通常是由有限的亚像素精度和浮点和定点舍入误差

引起的,看起来有点像闪烁,这几乎总是由舍入误差引起的。四边形的大小看起来非常合理,但近平面的值非常小。当垂直度乘以MVP矩阵时,这可能会导致较大的舍入误差。尝试将近平面设置为
.1f

编辑否则,请检查顶点创建代码是否存在可能的错误。这对我来说有点难理解——例如,顶面是用
-((s/2.0f)-.1)计算的,
-为什么要减去。1


也许编写一个新函数来创建顶点并在值中进行硬编码将是一种快速的方法来测试这是否是问题。

问题在于纹理有一个纹理泄漏,它会在边之间获得边界颜色。我的数学是正确的,并将纹理纹理放在侧面,但我可以修复正在发生的浮点错误。

你看到的只是纹理中确实有白色。因此,面边界上的片段最终从白色部分提取(如果在纹理上启用线性过滤器类型,您将更清楚地看到)

您可以做些什么来修复它:

  • 在展开的立方体纹理的边界处复制所需的颜色(在蓝色的左侧添加红色,在右侧添加黑色,在红色和黑色的顶部添加蓝色,在底部添加其他颜色…)
  • 或者更好,将代码切换为使用立方体贴图而不是二维贴图。它们在立方体面上提供适当的过滤

  • 你在剔除后面的正常面吗?@tuğrulbüyükıkı351; kık不,我根本没有进行任何剔除。当你旋转时会发生什么,那条线会消失然后再回来吗?您是否也可以提供有关格伦堡(glEnable)的信息(GL_POINT_SMOOTH);glEnable(GL_线_光滑);glEnable(GL_多边形_光滑);glEdgeFlag(GL_假);请为什么edge_旗帜是假的?@tuğrulbüyükık有时是的,有时线条会闪烁。点、线和多边形平滑之所以存在,是因为我认为这会有帮助,但没有帮助,边标志是边界边,当我想到边界时,我认为它们在我的脑海中是可见的,但这里不是这样。是否有可能线平滑替代多边形平滑?另外,您是否关闭了操作系统的桌面抗锯齿功能?可能会干扰你的软件我不知道我尝试过类似的东西,但我的纹理最终会被包装得很奇怪,但我不得不推迟一次,因为我必须马上去上课你的“接近”浮动可能会达到精度极限。顺便说一下,我现在正在研究固态物理。稍后见。我只是尝试将精度降低到.01f,但这并没有改变任何东西,接近值与创建平截头体的方式有关。听起来可能是这样的。使相机的近剪裁平面尽可能大,远剪裁平面尽可能小,这样深度缓冲区的精度就不会被浪费。unity开发者对Eric5h5的回答network@btaidm不管怎样,我不会把你的近平面值设置得比.001小很多,即使这样也会推它。我用一个新的可能解决方案[顶点创建代码中可能存在的错误]编辑了我的答案。我将近平面更改为1,并将四边形大小更新为5,将远平面更改为10,但直线没有消失。您可以接受Bahbar的答案,因为它似乎解决了正确的问题,也提供了很好的解决方案。无论如何,恭喜你解决了你的问题!
    float near_ = 0.00000001f;