テクスチャを重ねて描画するパターンが見つかりません。結果フラグメントの色を次のようにする必要があります。
tex1 + (1-tex1alpha)*tex2 + (1-tex1alpha-tex2alpha)*tex3
テクスチャを混合するのではなく、画像エディタでレイヤーのように重ねて配置します。
テクスチャを重ねて描画するパターンが見つかりません。結果フラグメントの色を次のようにする必要があります。
tex1 + (1-tex1alpha)*tex2 + (1-tex1alpha-tex2alpha)*tex3
テクスチャを混合するのではなく、画像エディタでレイヤーのように重ねて配置します。
投稿した数式をシェーダーに直接書き込むことができます。以下が機能します。
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;
};
ただし、3番目の引数が負になる可能性があり、望ましくない結果が生じる可能性があります。より良いでしょう:
gl_FragColor = tex1 + (1 - tex1.a) * tex2 + max(1 - tex1.a - tex2.a, 0) * tex3;
私は実際には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;
}
}