2014-02-01 3 views
0

У меня есть ландшафт в OpenGL и две текстуры, которые я совмещаю с использованием функции GLSL mix(). Вот текстуры, которые я использую. enter image description hereПочему моя прозрачность OpenGL прозрачна?

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

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

enter image description here

Вот мой пиксельный шейдер код ..

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; 
} 

ответ

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 

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

Edit: Исправление будет:

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, спасибо много, слишком плохо я не могу голосовать больше за ответ :) Cheers. – 2am

Смежные вопросы