我正在学习opengl,我得到了一些带有一些物体的小3D场景。在GLSL顶点着色器中,我在matixes上乘以顶点,如下所示:
vertexPos= viewMatrix * worldMatrix * modelMatrix * gl_Vertex;
gl_Position = vertexPos;
vertexPos是一个vec4变量变量,我将它传递给片段着色器。 以下是场景如何呈现的正常情况: normal render
然后我会做一个调试渲染。我在片段着色器中写道:
gl_FragColor = vec4(vertexPos.x, vertexPos.x, vertexPos.x, 1.0);
vertexPos乘以所有矩阵,包括透视矩阵,我假设我会得到一个从屏幕中心到右边缘的平滑渐变,因为它们被映射为-1到1平方。但看起来它们在屏幕空间中,但不应用透视变形。这是我看到的: (不要看红线和光源,他们使用不同的着色器)
如果我将它除去大约15,它将如下所示:
gl_FragColor = vec4(vertexPos.x, vertexPos.x, vertexPos.x, 1.0)/15.0;
有人可以解释一下,为什么坐标不均匀,场景仍能正确渲染透视变形? 附:如果我尝试将gl_Position放在片段着色器而不是vertexPos中,它就不起作用。
答案 0 :(得分:6)
在顶点着色器中计算后,所谓的透视分割应用于gl_Position
:
gl_Position.xyz /= gl_Position.w;
但除非你手动完成,否则不会发生变化。因此,您需要添加
vertexPos.xyz /= vertexPos.w;
在顶点着色器的末尾。确保在之后将值复制到gl_Position
,您不希望进行两次除法。