You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:47:35