OpenGL-Java-渲染问题,多边形闪烁和消失
在Java中使用LWJGL和GLSL着色器渲染Master Cheif时,我遇到了一些问题,其中出现了一些闪烁、多边形消失和奇怪的颜色。我一辈子都不知道为什么 它应该是什么样子的: 当我稍微移动相机时,它是什么样子的: 着色器: 主着色器: 灯塔 ShdaowMapping 斯马普勒 过滤器 所有代码: 静态网格:OpenGL-Java-渲染问题,多边形闪烁和消失,java,opengl,rendering,glsl,lwjgl,Java,Opengl,Rendering,Glsl,Lwjgl,在Java中使用LWJGL和GLSL着色器渲染Master Cheif时,我遇到了一些问题,其中出现了一些闪烁、多边形消失和奇怪的颜色。我一辈子都不知道为什么 它应该是什么样子的: 当我稍微移动相机时,它是什么样子的: 着色器: 主着色器: 灯塔 ShdaowMapping 斯马普勒 过滤器 所有代码: 静态网格: public void addVertices(Vertex[] vertices, int[] indices, boolean calcNorm) { if(ca
public void addVertices(Vertex[] vertices, int[] indices, boolean calcNorm) {
if(calcNorm) {
vertices = calcNormals(vertices, indices);
}
handler.setSize(indices.length);
EngineCore.polycount += indices.length/3;
glBindBuffer(GL_ARRAY_BUFFER, handler.getVbo());
glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handler.getIbo());
glBufferData(GL_ELEMENT_ARRAY_BUFFER, Util.createFlippedBuffer(indices), GL_STATIC_DRAW);
}
private void finalDraw(int typeIndex) {
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glBindBuffer(GL_ARRAY_BUFFER, handler.getVbo());
glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12);
glVertexAttribPointer(2, 3, GL_FLOAT, false, Vertex.SIZE * 4, 20);
glVertexAttribPointer(3, 3, GL_FLOAT, false, Vertex.SIZE * 4, 32);
glVertexAttribPointer(3, 3, GL_FLOAT, false, Vertex.SIZE * 4, 44);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handler.getIbo());
glDrawElements(typeIndex, handler.getSize(), GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);
}
您在示例图像中描述和显示的是一个问题的典型症状,该问题通常被称为“深度战斗”或“深度战斗”。这是由于深度缓冲区的精度限制造成的 最常见的情况是,如果深度缓冲区覆盖的范围很大,并且场景包含具有非常相似深度值的多边形,则会出现此问题 例如,想象一个多边形a在世界空间中稍微位于多边形B的前面。应用所有变换后,多边形A和多边形B中的像素最终可能具有相同的深度值,并且生成的深度将四舍五入到可用的深度缓冲精度。根据绘图顺序,在这种情况下,多边形A或多边形B中的像素将可见。典型的结果是,多边形a和多边形B的混合像素将显示多边形a应该覆盖多边形B的位置 有多种方法可以解决此问题:
- 减少深度范围。在标准透视投影中,这由近平面距离和远平面距离控制,其中相对远/近值是临界量。哪些值导致深度冲突在很大程度上取决于场景和深度缓冲精度。最安全的方法是将相对价值保持在尽可能小的水平。在大多数情况下,高达约100的值很少会导致问题,而1000或更高的值可能会导致问题
- 提高深度缓冲精度。最常见的深度缓冲区大小是16位和24位,许多GPU都支持这两种大小。如果出现问题,请选择至少24位。根据硬件和OpenGL版本,可能会提供更高分辨率的深度缓冲区
- 避免渲染深度几乎相同的多边形。或者移除深度非常接近可见多边形的隐藏多边形,或者至少将它们移动得更远
请注意,我的答案纯粹是关于世界空间中的原始多边形具有不同深度的情况。如果绘制深度完全相同的多边形(即共面多边形),则几乎总是会产生深度冲突,需要使用其他方法避免这种情况。因为这看起来不像这里的场景,所以我故意没有涵盖它。从视觉外观上看,它可能是深度战。你能试着把近平面移远一点,和/或把远平面移近一点吗?RenderingEngine.java中的第54行。例如,尝试1.0和100.0,而不是0.1和1000.0。@RetoKoradi完全修复了它,非常感谢!非常感谢,是的,我的zNear是0.01而不是0.1,这完全偏离了轨道!