我尝试在着色器中使用两个具有不同分辨率(因此具有不同纹理坐标)的纹理。但是,如果我用
texture2D()
以外的任何东西在第二个纹理上调用 texture()
(或 gl_TexCoord[0].xy
,没关系),输出就会变得扭曲,即使查找的结果没有在任何地方使用。
第一个纹理,又名
texture
:
第二个纹理,又名
noise
:
图像扭曲。传递到顶点着色器的
gl_Color
左侧为白色,右侧为黑色,因此不知何故该图像是 pixel * gl_Color * some_weird_color_shift
的结果
顶点着色器。我刚刚开始复制
gl_TexCoord[0]
并将其插值发送到片段。
varying vec4 noiseTexCoord;
void main()
{
// transform the vertex position
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// transform the texture coordinates
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
noiseTexCoord = gl_TexCoord[0];
// forward the vertex color
gl_FrontColor = vec4(gl_Color.z, gl_Color.z, gl_Color.z, 1);
}
片段着色器。将
bugger
注释掉后,将绘制 noise
纹理。
uniform sampler2D texture;
uniform sampler2D noise;
varying vec4 noiseTexCoord;
void main()
{
// lookup the pixel in the texture
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
// vec4 bugger = texture2D(noise, noiseTexCoord);
vec4 noise = texture2D(noise, gl_TexCoord[0].xy);
// gl_Color is unused
gl_FragColor = noise;
}
如果我取消注释
bugger
变量,则无论向 gl_FragColor
写入什么内容,生成的图像都将是扭曲的图像。我是否为其分配 pixel
、noise
或某种硬编码颜色并不重要。
如果
noiseTexCoord
包含一些奇怪的值,我不会感到惊讶,但我认为 texture2D
只是一个没有副作用的查找。怎么了?
问题是
noiseTexCoord
是 vec4
,我试图将其传递给需要 texture2D
的 vec2
。因此片段着色器无法编译。
正确的表达应该是:
vec4 bugger = texture2D(noise, noiseTexCoord.xy);
其行为符合预期。