渲染对象上的奇怪噪声 - OpenGL

时间:2014-07-11 18:12:41

标签: opengl textures glsl shader render

更具体地说,这是截图:

https://drive.google.com/file/d/0B_o-Ym0jhIqmY2JJNmhSeGpyanM/edit?usp=sharing

调试了大约3天后,我真的不知道。那些黑色线条和奇怪的分形黑色部分让我疯狂。几何图形由前向渲染渲染,逐层混合为我添加的每个光。

我的第一个猜测是下载最新的显卡驱动程序(我正在使用GTX 660m),但这并没有解决它。 VSync可能是一个可能的问题吗? (我在一个窗口而不是在全屏模式下渲染)或者最可能导致这种麻烦的点是什么?

我的代码是这样的:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glDepthMask(false);
glDepthFunc(GL_EQUAL);

/*loop here*/   
/*draw for each light I had*/   

glDepthFunc(GL_LESS);
glDepthMask(true);
glDisable(GL_BLEND);

2 个答案:

答案 0 :(得分:0)

有一件事我注意到你的照明顶点着色器代码:

void main()
{
    gl_Position = projectionMatrix * vec4(position, 1.0);
    texCoord0 = texCoord;
    normal0 = (normalMatrix * vec4(normal, 0)).xyz;
    modelViewPos0 = (modelViewMatrix * vec4(position, 1)).xyz;
}

您正在将投影矩阵直接应用于顶点位置,我假设它位于对象空间中。

尝试将其设置为:

    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);

我们可以在那里工作。

答案 1 :(得分:0)

这个答案有点推测,但根据症状和你发布的代码,我怀疑是精确问题。您链接的呈现代码以缩写形式显示:

useShader(FWD_AMBIENT);
part.render();

glDepthMask(GL_FALSE);
glDepthFunc(GL_EQUAL);
for (Light light : lights) {
    useShader(light.getShaderType());
    part.render();
}

因此,您使用不同的着色器多次渲染相同的内容,并依赖于生成的像素,最终得到相同的深度值(深度比较函数为GL_EQUAL)。这不是一个安全的假设。引自GLSL规范:

  

在本节中,方差指的是在不同程序中从同一表达式获取不同值的可能性。例如,假设两个顶点着色器在不同的程序中,每个着色器在两个着色器中都设置了相同的表达式,并且当两个着色器都运行时,该表达式中的输入值是相同的。由于两个着色器的独立编译,当两个着色器运行时,分配给gl_Position的值可能不完全相同。在此示例中,这可能会导致多次通过算法中几何对齐的问题。

我复制了整段,因为他们使用的例子听起来就像你正在做的事情的确切描述。

为防止这种情况发生,您可以将out变量声明为invariant。在用于多次渲染渲染的每个顶点着色器中,添加以下行:

invariant gl_Position;

如果所有输入都相同,这可以保证输出相同。为了满足这个条件,你还应该确保将完全相同的变换矩阵传递到两个着色器中,当然使用相同的顶点坐标。