【发布时间】:2020-03-06 09:17:51
【问题描述】:
我正在使用现代 OpenGL(顶点和片段着色器)加载网格,并且我有一个统一的颜色。
然后我用 depthtest 绘制网格:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
在绘制循环中,我首先用灰色绘制面部,然后用黑色绘制线条,如下所示:
GLint myLoc = glGetUniformLocation(shader_util.get_program_id(), "color");
// draw loop
glm::vec4 vColor { 0.7f, 0.7f, 0.7f, 1.0f };
glProgramUniform4fv(shader_util.get_program_id(), myLoc, 1, glm::value_ptr(vColor));
pMesh->draw_faces();
vColor = { 0.0f, 0.0f, 0.0f, 1.0f };
glProgramUniform4fv(shader_util.get_program_id(), myLoc, 1, glm::value_ptr(vColor));
pMesh->draw_wireframe();
这些是网格的绘制方法:
void Mesh::draw_wireframe()
{
glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) mVertexIndices.size());
}
void Mesh::draw_faces()
{
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)mVertexIndices.size());
}
问题是,这些线条看起来像这样,在绘图中有些中断:
有什么建议可以解决这个问题吗?
【问题讨论】:
-
基本问题是z-fighting。现在没有时间发布完整的答案,但是......在这种特殊情况下的修复可能是stencil buffer。现在将线框 和 绘制到模板缓冲区,然后只绘制深度和模板测试都通过的面(具体取决于您的配置方式)。
-
这能回答你的问题吗? How to avoid Z-fighting in distance?
-
@G.M.:好的,谢谢,但大多数这些功能在现代 OpenGL 中已被弃用。你知道使用着色器解决这个问题的方法吗?
-
哪些函数被弃用了?