9

我有以下着色器

顶点着色器

#version 330
layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec4 inColour;
layout (location = 2) in vec2 inTex;
layout (location = 3) in vec3 inNorm;
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
out vec4 ShadowCoord;
void main()
{
  gl_Position = projectionMatrix * transformationMatrix * vec4(inPosition, 1.0);
  ShadowCoord = gl_Position;
}

片段着色器

#version 330
in vec4 ShadowCoord;
out vec4 FragColor;
uniform sampler2D heightmapTexture;
void main()
{
  FragColor =  vec4(vec3(clamp(ShadowCoord.x/500,0.0,1.0),clamp(gl_FragCoord.y/500,0.0,1.0),0.0),1.0);
}

我希望这样做是绘制场景,左上角为绿色,右上角为黄色,右下角为红色,左下角为黑色。事实上,当我在片段着色器中ShadowCoord.x替换为时,就会发生这种情况。gl_FragCoord.x那么,为什么我只能得到垂直渐变的绿色呢?显然,我的 ShadowCoord 发生了一些奇怪的事情。有人知道这是什么吗?

4

1 回答 1

15

是的,gl_FragCoord是“衍生自gl_Position”。这并不意味着等于它。

gl_Position是特定顶点的剪辑空间位置。gl_FragCoord.xyz包含片段的窗口空间位置。这些不是同一个空间。为了从一个到另一个,图形硬件执行许多转换

其他值不会发生的转换。这就是片段着色器不调用它的原因gl_Position;因为它不再是那个价值了。它是根据用户设置的各种状态(视口和深度范围)从原始计算得出的新值。

用户定义的顶点参数按原样进行插值。您的用户定义的插值参数没有发生任何“棘手”的事情。系统正在做它应该做的事情:对你在三角形表面上传递的值进行插值。

于 2013-09-03T10:59:43.143 回答