调用texture2D()的SFML着色器(GLSL)有副作用吗?

问题描述 投票:0回答:1

我尝试在着色器中使用两个具有不同分辨率(因此具有不同纹理坐标)的纹理。但是,如果我用

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
只是一个没有副作用的查找。怎么了?

c++ shader sfml
1个回答
0
投票

问题是

noiseTexCoord
vec4
,我试图将其传递给需要
texture2D
vec2
。因此片段着色器无法编译。

正确的表达应该是:

vec4 bugger = texture2D(noise, noiseTexCoord.xy);

其行为符合预期。

© www.soinside.com 2019 - 2024. All rights reserved.