三.js 淡入/淡出后处理着色器

标签 three.js shader fadein fadeout post-processing

我想将场景淡入灰度,但这也适用于我想淡入或淡出的其他后期处理效果。

所以在这个例子中,我使用了 THREE.ColorifyShader,但是当激活它时,整个场景会立即收到预期的颜色

如何在后期处理中“应用不透明度/alpha”?

代码示例:

var effectColorify,
    copyPass;

    effectColorify = new THREE.ShaderPass(THREE.ColorifyShader);
    effectColorify.uniforms['color'].value.setRGB(0.8, 0.8, 0.8); // Grayscale

    copyPass = new THREE.ShaderPass(THREE.CopyShader);
    copyPass.renderToScreen = true;

    this.composerGrayscale = new THREE.EffectComposer(this.engine.renderer);
    this.composerGrayscale.addPass(this.renderPass);
    this.composerGrayscale.addPass(effectColorify);
    this.composerGrayscale.addPass(copyPass);

最佳答案

我通过向着色着色器添加“不透明度”统一解决了这个问题。这允许通过增加不透明度或相反的方式从正常的彩色场景平滑地混合到某种颜色。

effectColorify.uniforms['opacity'].value = 0.5; // 50% scene-color, 50% shader-color.

这是您可以复制到 ColorifyShader.js 中的调整后的着色器代码,它向后兼容以前的版本,因为默认不透明度为 1.0:
THREE.ColorifyShader = {

    uniforms: {

        "tDiffuse": { type: "t", value: null },
        "color":    { type: "c", value: new THREE.Color( 0xffffff ) },
        "opacity":  { type: "f", value: 1.0 }

    },

    vertexShader: [

        "varying vec2 vUv;",

        "void main() {",

            "vUv = uv;",
            "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",

        "}"

    ].join("\n"),

    fragmentShader: [

        "uniform float opacity;",
        "uniform vec3 color;",
        "uniform sampler2D tDiffuse;",

        "varying vec2 vUv;",

        "void main() {",

            "vec4 texel = texture2D( tDiffuse, vUv );",

            "vec3 luma = vec3( 0.299, 0.587, 0.114 );",
            "float v = dot( texel.xyz, luma );",

            "vec3 finalColor = vec3(",
                "(opacity * v * color.x) + ((1.0 - opacity) * texel.x),",
                "(opacity * v * color.y) + ((1.0 - opacity) * texel.y),",
                "(opacity * v * color.z) + ((1.0 - opacity) * texel.z)",
            ");",

            "gl_FragColor = vec4( finalColor, texel.w );",

        "}"

    ].join("\n")

};

关于三.js 淡入/淡出后处理着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27635755/

相关文章:

javascript - Threejs 像素化阴影

Three.js 高效地将 Uvs 映射到平面

opengl - GLSL:启用/禁用纹理+着色器

ios - 我可以在 iOS 上的 OpenGL ES 渲染中添加水印吗

javascript - 如何使 Javascript 数组中的部分文本在不同时间显示?

javascript - 在 Canvas 上操纵面部细节

reactjs - 使用react-三纤在 gatsby 站点中加载 gltf

textures - Vulkan 纹理模糊问题

ios - 淡入淡出动画太慢

jQuery 重定向 - 淡出/淡入