GLSL - 将坐标传递给片段着色器?

时间:2013-09-03 10:35:45

标签: opengl glsl shader

我有以下着色器

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正在发生一些棘手的事情。有谁知道它是什么?

1 个答案:

答案 0 :(得分:10)

是的,gl_FragCoord“源自gl_Position”。 意味着等于它。

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

的转换发生在其他值上。这就是碎片着色器不会将其称为gl_Position的原因;因为它不再是那个价值了。它是基于用户设置的各种状态(视口和深度范围)从原始计算的新值。

用户定义的顶点参数按原样进行插值。用户定义的插值参数不会发生任何“棘手”现象。系统正在完全按照它应该做的那样:插入穿过三角形表面的值。