Ради аргумента, предположим, что исходная геометрия изменяется от y = 0 до y = 1, и вы хотите, чтобы вторая текстура была полностью прозрачной при y = 0 и полностью непрозрачной при y = 1.Затем вы можете добавить дополнение с именем secondTextureAlpha
или что-то в этом роде.Загрузите его с вашими пре-преобразованными значениями y в шейдере, затем объедините входящие значения из исходных текстур либо так, чтобы второе умножилось на secondTextureAlpha
, если вы хотите придерживаться аддитивного смешивания, либо с помощью функции mix
для мультипликативного.
Так, например, шейдер fragement может выглядеть так:
varying vec3 lightDir,normal;
varying lowp float secondTextureAlpha;
uniform sampler2D tex,l3d;
void main()
{
vec3 ct,cf;
vec4 texel;
float intensity,at,af;
intensity = max(dot(lightDir,normalize(normal)),0.0);
cf = intensity * (gl_FrontMaterial.diffuse).rgb +
gl_FrontMaterial.ambient.rgb;
af = gl_FrontMaterial.diffuse.a;
texel = mix(texture2D(tex,gl_TexCoord[0].st),
texture2D(l3d,gl_TexCoord[0].st), secondTextureAlpha);
ct = texel.rgb;
at = texel.a;
gl_FragColor = vec4(ct * cf, at * af);
}
Чтобы добиться более сложного отображения, просто отрегулируйте, как вы загружаете secondTextureAlpha
в ваш вершинный шейдер, илиможет быть, принять его как атрибут ввода.