使用GLSL的OpenGL 4.5中的无限网格问题

kkbh8khc  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(210)

我一直在OpenGL 4.5中使用着色器玩一个无限网格,遵循这个教程here。因为这个教程是为Vulkan和更高版本的GLSL(我使用的是450内核)编写的,我不得不将顶点从顶点着色器中移到应用程序代码中。我使用元素缓冲区渲染四边形,所以我的顶点最终看起来像这样:

std::vector<glm::vec3> points{glm::vec3{-1, -1, 0},
                              glm::vec3{1, -1, 0},
                              glm::vec3{1, 1, 0},
                              glm::vec3{-1, 1, 0}};

std::vector<GLuint> indices{0, 1, 2, 2, 3, 0};

// Render like this:
glBindVertexArray(m_vao);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

我已经设法让网格完全工作,但它有两个问题,我不能弄清楚:
1.绘制在网格顶部的对象会随着地平线的上移而被剪切。这感觉就像是z-战斗,但我不是100%确定为什么会发生这种情况,看看立方体是如何在网格之后渲染的。
1.网格的底部是完全实心的。这一点也让我感到困惑,因为根据片段着色器,网格线之间的空间应该是完全透明的...然而它们看起来却是完全实心的。
下面是一些正在发生的情况的示例图像:x1c 0d1x看到立方体被切成两半。如果我向下移动相机,立方体的其余部分将慢慢出现。相反,如果我向上移动相机,立方体最终完全消失。


这是网格的底面。我应该可以透过网格看到立方体,但网格的行为就像一个实体。
有人知道我做错了什么吗?我是否应该在应用程序中启用某些功能?作为参考,我目前启用了以下功能:

glEnable(GL_MULTISAMPLE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
3j86kqsm

3j86kqsm1#

Blending仅在Depth Test禁用或对象从后向前绘制时有效。当深度测试启用时(使用默认函数GL_LESS)较近的对象会战胜较远的对象。即使片段的alpha通道为0,该片段也会影响深度缓冲区和深度测试。因此,如果较近的、较远的片段先前绘制了透明片段。
你只有一个带有透明碎片的物体,即网格。要解决这个问题,只需在立方体后画出网格即可:

  • 启用深度测试
  • 绘制实体对象(立方体)
  • 启用混合
  • 绘图网格

相关问题