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