如何在openGL中获得同类的屏幕空间坐标

时间:2018-01-06 20:41:36

标签: c++ qt opengl glsl qopenglfunctions

我正在学习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平方。但看起来它们在屏幕空间中,但不应用透视变形。这是我看到的: (不要看红线和光源,他们使用不同的着色器)

debug render

如果我将它除去大约15,它将如下所示:

gl_FragColor = vec4(vertexPos.x, vertexPos.x, vertexPos.x, 1.0)/15.0;

devided by 15

有人可以解释一下,为什么坐标不均匀,场景仍能正确渲染透视变形? 附:如果我尝试将gl_Position放在片段着色器而不是vertexPos中,它就不起作用。

1 个答案:

答案 0 :(得分:6)

在顶点着色器中计算后,所谓的透视分割应用于gl_Position

gl_Position.xyz /= gl_Position.w;

但除非你手动完成,否则不会发生变化。因此,您需要添加

vertexPos.xyz /= vertexPos.w;

在顶点着色器的末尾。确保之后将值复制到gl_Position,您不希望进行两次除法。