如何在 openGL 中获得均匀屏幕 space 坐标

How to get homogeneous screen space coordinates in openGL

我正在研究 opengl,我有一些带有一些对象的 3d 小场景。在 GLSL 顶点着色器中,我像这样在矩阵上乘以顶点:

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 正方形。但是看起来它们在屏幕上 space 但未应用透视变形。这是我看到的: (不要看红线和光源,他们用的是不同的shader)

debug render

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

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

devided by 15

谁能解释一下,为什么坐标不均匀,场景仍然正确渲染,但存在透视变形? P.S。如果我尝试将 gl_Position 放在片段着色器而不是 vertexPos 中,它不起作用。

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

gl_Position.xyz /= gl_Position.w;

但这不会发生在您的变量上,除非您手动执行。因此,您需要添加

vertexPos.xyz /= vertexPos.w;

在顶点着色器的末尾。确保在 将值复制到 gl_Position 后执行此操作,您不想执行两次除法。