Теперь проще всего было бы проверить альфа цвета текстуры и вывести другой цвет в зависимости от этого:
void main()
{
vec4 color = texture2D(uTexture0, vTextureCoord);
gl_FragColor = (color.a > 0.1) ? color : vec4(0.6, 0.7, 0.3, 1.0);
}
Конечно, вы можете адаптировать этот порог, но использование только 0.0
может не сработать из-за проблем с точностью. Динамическое ветвление в фрагментном шейдере может быть не самой лучшей идеей с точки зрения производительности, но если вы скажете, что не можете просто изменить текстуру, потому что цвет может измениться, это будет самый простой способ.
Если изменение цвета сохраняется на большом количестве кадров, возможно, вы также можете создать временную текстуру, которая содержит измененный цвет в прозрачных областях. Это может быть легко достигнуто на графическом процессоре с использованием вышеуказанного шейдера и просто рендеринг во временную текстуру (с использованием FBOs ) вместо буфера кадров дисплея.