почему моя текстура OpenGL прозрачна?

0

У меня есть ландшафт OpenGL и две текстуры, которые я совмещаю с использованием функции GLSL mix(). Вот текстуры, которые я использую. Изображение 174551

Теперь я могу комбинировать и смешивать эти две текстуры, но по какой-то причине, когда я визуализую текстуры на местности, ландшафт становится прозрачным. Сначала создаю текстуру LHS, а затем визуализирую текстуру RHS с альфа-каналом, я не понимаю, почему она прозрачна.

Изображение 174551 Вот интересный факт, на скриншоте вы можете увидеть результат местности при визуализации на графическом процессоре Nvidia, когда я делаю то же самое на interl HD 3k, у меня получается другой результат. Этот результат заключается в том, как он должен быть, ничто не прозрачно в этом следующем скриншоте.

Изображение 174551

Вот мой код шейдера.

void main() 
{
vec4 dryTex   = texture( u_dryTex, vs_texCoord *1 );
vec4 grassTex = texture( u_grassTex, vs_texCoord *1 );
vec4 texColor1= mix(dryTex, grassTex , grassTex.a);   
out_fragColor = texColor1;
}
Теги:
opengl
glsl
textures
texture-mapping

1 ответ

6
Лучший ответ

Похоже, вы также интерполируете альфа-канал. Компонентный подход:

texColor1.r = dryTex.r*(1-grassTex.a) + grassTex.r*grassTex.a
texColor1.g = dryTex.g*(1-grassTex.a) + grassTex.g*grassTex.a
texColor1.b = dryTex.b*(1-grassTex.a) + grassTex.b*grassTex.a
texColor1.a = dryTex.a*(1-grassTex.a) + grassTex.a*grassTex.a

Таким образом, альфа-канал для непрозрачного dryTex будет

grassTex.a^2

который является прозрачным большую часть времени.

Изменение: Исправление:

void main() 
{
    vec4 dryTex   = texture( u_dryTex, vs_texCoord *1 );
    vec4 grassTex = texture( u_grassTex, vs_texCoord *1 );
    vec4 texColor1= vec4(mix(dryTex.rgb, grassTex.rgb, grassTex.a), 1);   
    out_fragColor = texColor1;
}
  • 0
    Это помогло, я вижу, что опыт работы пригодится при работе над OpenGL, большое спасибо, очень жаль, что я не могу больше голосовать за ответ :) Приветствия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню