【问题标题】:Draw Lines above faces在面上方画线
【发布时间】: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 中已被弃用。你知道使用着色器解决这个问题的方法吗?
  • 哪些函数被弃用了?

标签: c++ opengl glm-math


【解决方案1】:

我找到了 glPolygonOffset 的解决方案:

glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1.0f, 1.0f);

glm::vec4 vColor { 0.7f, 0.7f, 0.7f, 1.0f };
GLint myLoc = glGetUniformLocation(shader_util.get_program_id(), "color");
glProgramUniform4fv(shader_util.get_program_id(), myLoc, 1, glm::value_ptr(vColor));

pMesh->draw_faces();

glDisable(GL_POLYGON_OFFSET_FILL);

vColor = { 0.0f, 0.0f, 0.0f, 1.0f };
glProgramUniform4fv(shader_util.get_program_id(), myLoc, 1, glm::value_ptr(vColor));

pMesh->draw_wireframe();

但我会在片段着色器中寻找类似的解决方案。

【讨论】:

  • 我认为如果你想在着色器中使用转换:learnopengl.com/Getting-started/Transformations。特别是缩放。像 glm::mat4 trans = glm::mat4(1.0f); trans = glm::scale(trans, glm::vec3(1, 1.01, 1)); (我使用 python 并且在平面网格上进行,所以不确定如果缩放所有方向会对球体产生什么影响?)
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2011-05-24
  • 2012-03-03
  • 2014-08-26
相关资源
最近更新 更多