#java #android #opengl-es
Вопрос:
Я пытаюсь добавить две текстуры в 3d-куб. Я достиг своей цели, но по пути потерял цвет фона.
Я хочу показать исходный цвет изображений, а также цвет фона. Я использую микс, но он отображает фон полностью темным.
Вот как это выглядит мой фрагментшадеркод:
private final String fragmentShaderCode =
"precision mediump float;"
"uniform sampler2D u_Texture0;"
"uniform sampler2D u_Texture1;"
"uniform vec4 aColor;"
"varying vec2 v_TexCoordinate0;"
"varying vec2 v_TexCoordinate1;"
"void main() {"
" vec4 base = texture2D(u_Texture0, v_TexCoordinate0);"
" vec4 overlay = texture2D(u_Texture1, v_TexCoordinate1);"
" mediump float ra = (overlay.a) * overlay.r (1.0 - overlay.a) * base.r;"
" mediump float ga = (overlay.a) * overlay.g (1.0 - overlay.a) * base.g;"
" mediump float ba = (overlay.a) * overlay.b (1.0 - overlay.a) * base.b;"
" gl_FragColor = vec4(mix(aColor.rgb, vec4(ra, ga, ba, 1.0).rgb , vec4(ra, ga, ba, 1.0).a), 1.0);"
"}";
Ответ №1:
Альфа — канал vec4(ra, ga, ba, 1.0)
равен 1,0. Поэтому результат vec4(ra, ga, ba, 1.0).a
всегда равен 1,0.
Вам нужно использовать альфа-каналы текстуры. например: max(base.a, overlay.a)
:
vec3 textureColor = vec3(ra, ga, ba);
float textureAlpha = max(base.a, overlay.a);
gl_FragColor = vec4(mix(aColor.rgb, textureColor, textureAlpha), 1.0);
Упростите код, смешав цвета текстуры с mix
функцией:
void main() {
vec4 base = texture2D(u_Texture0, v_TexCoordinate0);
vec4 overlay = texture2D(u_Texture1, v_TexCoordinate1);
vec3 textureColor = mix(base.rgb, overlay.rgb, overlay.a);
float textureAlpha = max(base.a, overlay.a);
gl_FragColor = vec4(mix(aColor.rgb, textureColor, textureAlpha), 1.0);
}
Комментарии:
1. ух ты, спасибо! Это то, чего я хотел!!
2. @Bocho Спасибо тебе. Пожалуйста.