繁体   English   中英

带有 GLSL 的 OpenGL 4.5 中的无限网格问题

[英]Issues with infinite grid in OpenGL 4.5 with GLSL

我一直在使用 OpenGL 4.5 中的着色器来玩弄无限网格,按照这里的教程。 由于本教程是为 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-fighting,但我不能 100% 确定为什么会发生这种情况,看看立方体是如何在网格之后渲染的。
  2. 网格的底面是完全实心的。 这也让我感到困惑,因为基于片段着色器,网格线之间的空间应该是完全透明的……但它们似乎是完全实心的。

以下是正在发生的一些示例图像: 在此处输入图像描述 看到立方体被切成两半。 如果我向下移动相机,立方体的其余部分会慢慢出现。 相反,如果我向上移动相机,立方体最终会完全消失。

在此处输入图像描述 这是网格的底部。 我应该能够通过网格看到立方体,但网格的行为就像一个实体对象。

有没有人知道我做错了什么? 我应该在应用程序中启用某些东西吗? 作为参考,我目前已启用此功能:

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

仅当禁用深度测试或从后向前绘制对象时,混合才有效。 当启用深度测试(使用其默认功能GL_LESS )时,较近的物体会战胜较远的物体。 即使片段的 alpha 通道为 0,片段也会影响深度缓冲区和深度测试。 因此,如果先前绘制了更近的透明片段,则丢弃更远的片段。
您只有一个带有透明片段的对象,即网格。 要解决您的问题,只需在立方体之后绘制网格:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM