SFML中GLSL调用texture2D()是否有副作用?纹理采样异常排查
GLSL多纹理采样异常导致画面失真问题
我在GLSL着色器中使用两张不同分辨率的纹理(对应不同纹理坐标),发现调用texture2D()(或texture())采样第二张纹理时,只要传入的不是gl_TexCoord[0].xy,哪怕完全不使用采样结果,输出画面也会出现失真。
相关素材说明
- 第一张纹理(命名为
texture):[主纹理] - 第二张纹理(命名为
noise):[噪声纹理] - 失真后的画面:传入顶点着色器的
gl_Color为左白右黑渐变,最终画面效果类似pixel * gl_Color * 异常颜色偏移的结果[失真效果]
顶点着色器代码
varying vec4 noiseTexCoord; void main() { // 变换顶点位置 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; // 变换纹理坐标 gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; noiseTexCoord = gl_TexCoord[0]; // 传递顶点颜色 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() { // 采样主纹理像素 vec4 pixel = texture2D(texture, gl_TexCoord[0].xy); // vec4 bugger = texture2D(noise, noiseTexCoord); vec4 noise = texture2D(noise, gl_TexCoord[0].xy); // 未使用gl_Color gl_FragColor = noise; }
取消注释bugger变量后,无论gl_FragColor赋值为pixel、noise还是硬编码颜色,画面都会失真。我原本以为texture2D只是无副作用的采样操作,请问问题出在哪里?
内容的提问来源于stack exchange,提问作者doomista
相关产品推荐
相关产品推荐

