tutorial - texturas multiples opengl
Fragmento shader y colorear una textura (1)
Su modo de fusión supone alfa pre-multiplicada, que normalmente es una gran opción. Pero requiere que los valores RGB se multipliquen con el valor alfa. El valor alfa solo controla, qué parte del fondo se agrega a los fragmentos entrantes en ese modo. Entonces, para hacer que RGB "se desvanezca", también deben ser modulados por el valor alfa.
Ahora cuando estás jugando con ese valor alfa para ser constante, tus valores RGB ya no coinciden con esa premultiplicación. Pruebe esto en su lugar para su tinte rojo:
gl_FragColor = tex + vec4(0.5, 0, 0, 1)*tex.a;
Esto agrega un rojo modulado alfa a la textura.
En el caso de que espere que la imagen desaparezca por completo, necesitaría un modo de fusión diferente, a saber, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, pero con eso necesita una imagen alfa no premultiplicada, o puede compensar esa premultiplicación en el sombreador:
gl_FragColor = vec4(tex.rgb/tex.a, tex.a);
Intento darle sentido al ajuste de los colores de la textura con un sombreador de fragmentos. Mi shader de fragmentos es súper simple:
uniform sampler2D sampler;
void main() {
vec4 tex = texture2D ( sampler, uvVarying );
gl_FragColor = vec4(tex.r, tex.g, tex.b, tex.a);
}
Esto dibuja la textura de mi perro como se esperaba:
si luego cambio el sombreador a
gl_FragColor = vec4(tex.r, tex.g, tex.b, 1.0);
el resultado es lo que esperaba, la información de transparencia se pierde:
pero si en cambio lo configuro para:
gl_FragColor = vec4(tex.r, tex.g, tex.b, 0.0);
Esperaba que desapareciera por completo, pero en cambio me da:
¿¿Que esta pasando??
Y a mi problema original: quería agregar un poco de tinte rojo a mi textura con:
gl_FragColor = vec4(tex.r + 0.5, tex.g, tex.b, tex.a);
Ahora, esperaba que tuviera la misma información de transparencia que la textura original, pero en cambio me sale esto:
Que me estoy perdiendo aqui. La textura usa la combinación predeterminada del motor que es src = GL_ONE, dst = GL_ONE_MINUS_SRC_ALPHA
.