Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL-Java-渲染问题,多边形闪烁和消失_Java_Opengl_Rendering_Glsl_Lwjgl - Fatal编程技术网

OpenGL-Java-渲染问题,多边形闪烁和消失

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

在Java中使用LWJGL和GLSL着色器渲染Master Cheif时,我遇到了一些问题,其中出现了一些闪烁、多边形消失和奇怪的颜色。我一辈子都不知道为什么

它应该是什么样子的:

当我稍微移动相机时,它是什么样子的:

着色器:

主着色器: 灯塔 ShdaowMapping 斯马普勒 过滤器

所有代码:

静态网格:

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,这完全偏离了轨道!