У меня есть ландшафт в OpenGL и две текстуры, которые я комбинирую, используя функцию GLSL mix ().
Вот текстуры, которые я использую.
Теперь я могу комбинировать и смешивать эти две текстуры, но по какой-то причине, когда я рендеринг текстур на местности, местность становится прозрачной.
Сначала я рендерил текстуру LHS, а затем рендерил текстуру RHS с альфа-каналом, я не понимаю, почему она прозрачна.
Вот интересный факт, на скриншоте вы можете увидеть результат рельефа при рендеринге на Nvidia GPU, когда я рендерил то же самое на interl HD 3k, я получаю другой результат.
Этот результат такой, каким он должен быть, на следующем снимке экрана ничего не видно.
Вот мой фрагмент кода шейдера ..
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;
}
Похоже, вы тоже интерполируете альфа-канал. Компонентно, смесь делает:
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;
}
Других решений пока нет …