我有以下着色器
VertexShader
#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;
}
FragmentShader
#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正在发生一些棘手的事情。有谁知道它是什么?
答案 0 :(得分:10)
是的,gl_FragCoord
“源自gl_Position
”。 不意味着等于它。
gl_Position
是特定顶点的剪辑空间位置。 gl_FragCoord.xyz
包含片段的窗口空间位置。这些空间不一样。为了从一个到另一个,图形硬件执行a number of transformations。
不的转换发生在其他值上。这就是碎片着色器不会将其称为gl_Position
的原因;因为它不再是那个价值了。它是基于用户设置的各种状态(视口和深度范围)从原始计算的新值。
用户定义的顶点参数按原样进行插值。用户定义的插值参数不会发生任何“棘手”现象。系统正在完全按照它应该做的那样:插入穿过三角形表面的值。