【问题标题】:Compositing colors and textures in webgl在 webgl 中合成颜色和纹理
【发布时间】:2021-05-27 04:45:48
【问题描述】:

如何在 webgl 中进行颜色合成?我不确定要搜索什么,也许我错过了一个词。我希望能够绘制颜色或纹理作为叠加层。例如,在这里我尝试添加不透明度为 0.2 的黑色叠加层,但我没有直接使用颜色,而是减去不透明度。如果我想使用不同的颜色作为覆盖,我将不得不使用不同的解决方法。如何在不使用任何解决方法的情况下叠加/合成不同的颜色或纹理? Shadertoy link

void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
    vec2 uv = fragCoord/iResolution.xy;

    vec4 col = texture(iChannel0, uv);
    vec4 overlay = vec4(0., 0., 0., 0.2);

    col -= overlay.a;
    
    fragColor = col;
}

【问题讨论】:

    标签: webgl


    【解决方案1】:

    如果您想将纹理颜色变暗为黑色,您可以使用简单的乘法:

    vec4 col = texture(iChannel0, uv);
    col *= 0.8; // 20% darker
    

    或者如果你想使用一种颜色,你也可以将它们相乘

    vec4 col = texture(iChannel0, uv);
    vec4 tint = vec4(1.0, 0.5, 0.0, 1.0); // Orange
    col *= tint;
    

    有很多方法可以将颜色混合在一起。在颜色之间创建平滑渐变的另一种方法是by using the mix() function。没有一个答案。

    【讨论】:

    • 感谢您的回复,您的混合效果很好,但不适用于我想要的黑色。我想出了另一种为纹理添加颜色的方法,例如(color.rgb - 0.5) * color.a;,但这不适用于灰色。如果有人想要覆盖任何颜色的通用解决方案,他们可以做什么?您可以建议任何主题/讨论,以便我收集更多信息?
    • “覆盖”是一个非常模糊的术语,它可能意味着任意数量的数学方程。比如Photoshop has 31 different blending modes,每一个都是通过不同的计算实现的。
    • 是的,我的问题很模糊,我会尽力澄清。假设你有两个纹理。您想先绘制纹理 1,然后在其上绘制纹理 2,但在同一着色器中以一半不透明度,您怎么能做到这一点?在 Photoshop 中,如果您将这 2 个纹理作为图层并降低顶层的不透明度,最终图像将看起来很自然,并且适用于任何图像。如何在单片段着色器中做同样的事情?
    • 您是否查看了我在答案中链接的 mix() 函数? col = mix(texture1, texture2, 0.5);
    • 哦,我试过了,但它忽略了不透明度,但我意识到我可以使用新颜色的不透明度来获得所需的结果。 col = mix(texture, color, color.a);。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多