使用深度缓冲区和GL_LINES

Eta*_*tan 3 opengl rendering visibility depth-buffer opengl-es-2.0

我想绘制一个删除了隐藏边缘的对象的边缘.我想要应用的想法是首先将对象的面渲染到深度缓冲区,然后在第二次渲染中绘制边缘并启用深度测试.

由于不是所有的三角形边都应该是可见的,所以边是单独存储的(简单示例:在立方体中,对角线边缘不应该是可见的,尽管它们在那里,因为四边形被渲染为两个三角形).因此使用绘制面,使用单独的顶点缓冲区GL_TRIANGLES绘制边GL_LINES.

问题是隐藏边缘部分用此设置显示,可见边缘部分隐藏.我怎样才能取得适当的结果?

  • 没有深度测试:

    没有深度测试

  • 深度测试:

    通过深度测试

  • 渲染到深度缓冲区的面:

    只面对面

我使用带有附加颜色和深度缓冲区的帧缓冲区来绘制我的对象.

// Color buffer setup.
glBindTexture(GL_TEXTURE_2D, objectEdges);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 360, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);

// Depth buffer setup.
glBindRenderbuffer(GL_RENDERBUFFER, objectFaces);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 640, 360);

// Framebuffer setup.
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_2D, objectEdges, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 
                          GL_RENDERBUFFER, objectFaces);
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
assert(glGetError() == GL_NO_ERROR);
Run Code Online (Sandbox Code Playgroud)

此设置没有任何问题.我绘制我的对象如下:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_TRUE);
glBindVertexArrayOES(vertexArray_faces);
glDrawArrays(GL_TRIANGLES, 0, vertexCount_faces);
glBindVertexArrayOES(0);

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_FALSE);
glBindVertexArrayOES(vertexArray_edges);
glDrawArrays(GL_LINES, 0, vertexCount_edges);
glBindVertexArrayOES(0);

glDisable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)

使用的着色器只是标准的模型 - 视图 - 投影顶点着色器,以及为所有片段输出白色的片段着色器.

GLKMatrix4 projectionMatrix = 
    GLKMatrix4MakePerspective(
        GLKMathDegreesToRadians(65.0f), 640.0 / 360.0f, 0.01f, 10.0f);
GLKMatrix4 modelViewMatrix = 
    GLKMatrix4MakeLookAt(0.2f, 0.4f, 0.2f, 0.2f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)

dat*_*olf 5

您遇到的问题是,为线条计算深度值的方式与填充的基元略有不同.你试图做的事情是存在所谓的"多边形"的原因之一.整个过程在附录中的官方编程指南中进行了描述:"隐藏线删除"