OpenGL着色器 - 重叠多个纹理

时间:2013-01-31 18:49:20

标签: opengl fragment-shader multitexturing

我无法找到一种模式来绘制纹理。 我需要将结果片段颜色设置为:

tex1 +(1-tex1alpha)* tex2 +(1-tex1alpha-tex2alpha)* tex3

不要混合纹理,而是将其放置在图像编辑器中的其他类似图层上。

2 个答案:

答案 0 :(得分:0)

我并不真正使用OpenGL,因此GLSL代码可能不完全有效。但是你要找的着色器看起来应该是这样的。随意纠正任何错误。

vec4 col;
col = texture2D(tex3, uv)
if(col.a == 1) { gl_FragColor = col; return; }
col = texture2D(tex2, uv)
if(col.a == 1) { gl_FragColor = col; return; }
col = texture2D(tex1, uv)
if(col.a == 1) { gl_FragColor = col; return; }

即如果纹理的数量是固定的。如果您有可变数量的纹理,您可以将它们放入纹理数组中并执行以下操作:

vec4 col;
for(int i = nTextures - 1; i >= 0; --i)
{
    col = texture2DArray(textures, vec3(uv, i));
    if(col.a == 1)
    {
        gl_FragColor = col;
        return;
    }
}

答案 1 :(得分:0)

您可以将直接发布的公式写入着色器。以下内容适用:

uniform sampler2D sampler1;
uniform sampler2D sampler2;
uniform sampler2D sampler3;

varying vec2 texCoords;

void main()
{
    vec4 tex1 = texture(sampler1, texCoords);
    vec4 tex2 = texture(sampler2, texCoords);
    vec4 tex3 = texture(sampler3, texCoords);
    gl_FragColor = tex1 + (1 - tex1.a) * tex2 + (1 - tex1.a - tex2.a) * tex3;
};

然而,第三个论点可能会变为负数,这会产生不希望的结果。更好的是:

gl_FragColor = tex1 + (1 - tex1.a) * tex2 + max(1 - tex1.a - tex2.a, 0) * tex3;