3

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

调试渲染

如果我将它除以大约 15,它将看起来像这样:

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

除以 15

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

4

1 回答 1

6

在顶点着色器中计算之后应用所谓的透视除法:gl_Position

gl_Position.xyz /= gl_Position.w;

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

vertexPos.xyz /= vertexPos.w;

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

于 2018-01-06T20:48:27.380 回答