【问题标题】:Opengl shader GLSL blend two texture by coordOpengl着色器GLSL通过坐标混合两个纹理
【发布时间】:2013-12-01 18:54:17
【问题描述】:

如何混合两个纹理,使纹理并排,左侧有 50% 的纹理 A,右侧有 50% 的纹理 B。

例如

----------------
|       |      |
| 50% A | 50% B|
|       |      |
----------------

我希望区域是可变的,所以可能是 25% A 75% B。

现在我可以在 Rect 上完全混合两个纹理,每个都是半透明的。

这是我的碎片着色器

uniform sampler2D tex;
uniform sampler2D texx;
uniform float alpha;
in vec2 textureCoord;
out vec4 finalColor;

void main() {
    vec4 first_sample = texture(tex, textureCoord);
    vec4 second_sample = texture(texx, textureCoord);

    finalColor = first_sample * alpha + second_sample * (1-alpha);
}

我需要在我的 C++ 程序中创建一个 alpha 蒙版纹理吗? 谢谢。

【问题讨论】:

    标签: opengl glsl shader fragment-shader


    【解决方案1】:

    Alpha 蒙版(一维纹理就足够了)是一种可能的解决方案,但在这种特殊情况下,它不是必需的

    uniform sampler2D tex0;
    uniform sampler2D tex1;
    uniform float t;    // e.g. 0.4
    in vec2 texcoord;
    out vec4 outColor;
    
    void main(void)
    {
        vec4 t0 = texture2D(tex0, texcoord);
        vec4 t1 = texture2D(tex1, texcoord);
        outColor = mix(t0, t1, step(t, texcoord.x));
    }
    

    顺便说一句,它不称为“混合”。而是“阈值”或“步骤”。

    【讨论】:

    • +1 表示无分支方式。使用布尔值mix()outColor = mix(t0, t1, bvec4(texcoord.x >= t)); 或三元表达式可能更简洁,它们应该在较新的架构上转换为至少相等甚至更快的机器代码:outColor = texcoord.x < t ? t0 : t1;
    • @Sam ternary 是纯的 if 并导致分支指令(cgc -profile gp5fp - 还有 2 条指令,带有分支)。然而,在这种特殊情况下这可能会更快,但在其他情况下 - 我认为cgc 输出非常准确,因为它与内部 nvidia 驱动程序中使用的编译器相同。虽然需要测量实际结果......不确定二进制混合 - 在标准中找不到它,cgc 不理解这个。
    • 不确定,哪个版本引入了二进制混合:opengl.org/sdk/docs/manglsl/xhtml/mix.xml。据我所知,可以评估三元表达式的两个分支(就像之前采集两个样本一样),然后丢弃不匹配的分支。基准测试肯定是找出答案的唯一方法,因为有太多不同的软件和硬件星座:outColor = texcoord.x < t ? texture2D(tex0, texcoord) : texture2D(tex1, texcoord);
    • 谢谢。这比创建蒙版纹理更简单。
    • 嗯,这就是所谓的“静态分支”。动态分支,取决于条件变化的频率,也可能被评估,即使条件失败。但是三元运算符和if 本质上是一样的(就像在 C 中一样)——编译器会决定放什么。
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多