对于初学者来说,没有合理的理由从texture2D (...)
. GLSL 中的纹理函数总是返回一个vec4。同样,grab.xyz * m_thresh
始终是vec3,因为标量乘以向量不会改变向量的维度。
现在,事情变得有趣了……gl_TexCoord [n]
您正在使用的 GLSL 内置实际上是一个预先声明的变量. 您不应该在顶点着色器中读取此内容,因为它定义了顶点着色器输出/片段着色器输入。
GLSL 1.2 中用于获取纹理单元 N 的纹理坐标的适当顶点着色器内置变量实际上是gl_MultiTexCoord<N>
因此,您的顶点和片段着色器应如下所示:
顶点着色器:
#version 120
//varying vec2 texCoord; // You actually do not need this
void main(void)
{
gl_Position = ftransform();
//texCoord = gl_MultiTexCoord0.st; // Same as comment above
gl_TexCoord [0] = gl_MultiTexCoord0;
}
片段着色器:
#version 120
uniform float m_thresh;
uniform sampler2D grabTexture;
//varying vec2 texCoord;
void main(void)
{
//vec4 grab = texture2D (grabTexture, texCoord.st);
vec4 grab = texture2D (grabTexture, gl_TexCoord [0].st);
vec3 colour = grab.xyz * m_thresh;
gl_FragColor = vec4( colour, 0.5 );
}
还记得我说gl_TexCoord [n]
的是内置变量吗?你可以读/写这个而不是varying vec2 texCoord;
在 GLSL 1.2 中创建你自己的自定义。我注释掉了使用自定义变量的行,以向您展示我的意思。
以下内置变量可用于在顶点着色器中写入。如果相应的片段着色器或固定管道中的任何功能使用它或从它派生的状态,则应写入特定的。
[...]
变化的 vec4 gl_TexCoord[]; // 最多是 gl_MaxTextureCoords
以下属性名称内置于 OpenGL 顶点语言中,可在顶点着色器中用于访问 OpenGL 声明的属性的当前值。
[...]
属性 vec4 gl_MultiTexCoord0;
底线是gl_MultiTexCoord<N>
定义顶点属性(顶点着色器输入),gl_TexCoord [n]
定义变化(顶点着色器输出,片段着色器输入)。还值得一提的是,这些在 GLSL 的较新(核心)版本中不可用。