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

添加GLSL3后Three.js简易后期处理RawShader失效问题咨询

问题原因及解决方案

核心问题

启用glslVersion: THREE.GLSL3后,你的片段着色器仍在使用GLSL 1.0的内置变量gl_FragColor,但GLSL 3.0(对应WebGL2)已经废弃了这个变量,必须显式声明输出颜色变量,否则着色器编译失败,导致后期处理的红色画面无法渲染。

另外,你的顶点着色器写法虽能运行,但可以更贴合Three.js ShaderPass的默认全屏几何体属性,避免潜在问题。

修改后的代码

修正后的着色器代码

// 顶点着色器
const VS =`
    attribute vec2 uv;
    attribute vec3 position;

    void main() {  
        // 用position生成NDC坐标,贴合ShaderPass默认几何体的属性
        gl_Position = vec4(position, 1.0);
    }`;

// 片段着色器
const FS =`
    // GLSL3必须显式声明输出颜色变量
    out vec4 fragColor;
    // 启用3D纹理采样器
    uniform sampler3D tDiffuse;

    void main() {
        // 替换gl_FragColor为自定义输出变量
        fragColor = vec4(1., 0., 0., 1.);
        // 如果要采样3D纹理,示例写法:
        // vec3 texCoord = vec3(0.5); // 示例纹理坐标
        // fragColor = texture(tDiffuse, texCoord);
    }`;

额外注意事项

  1. 确保RawShaderMaterial正确传递3D纹理uniform:
// 假设你已经创建了3D纹理volumeTexture
const shaderMaterial = new THREE.RawShaderMaterial({ 
    uniforms: {
        tDiffuse: { value: volumeTexture }
    },
    glslVersion: THREE.GLSL3,
    vertexShader: VS,   
    fragmentShader: FS, 
});
  1. 3D纹理必须是WebGL2支持的格式,比如使用THREE.Data3DTexture创建,确保纹理的format、type等参数符合WebGL2要求。

其他优化点

你的render方法中同时调用了this.renderer.render(this.scene, this.camera)和this.composer.render(),这会导致场景被渲染两次(一次直接渲染到画布,一次通过Composer)。如果只需要后期处理效果,应该去掉this.renderer.render(this.scene, this.camera),只保留this.composer.render()。

内容的提问来源于stack exchange,提问作者Spiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:50:35