更具体地说,这是截图:
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);
答案 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;
如果所有输入都相同,这可以保证输出相同。为了满足这个条件,你还应该确保将完全相同的变换矩阵传递到两个着色器中,当然使用相同的顶点坐标。