Визуализировать текстуру (декаль) с альфа-значением? - PullRequest
1 голос
/ 26 июня 2019

Я пытался нарисовать две текстуры надписей и фона, но только альфа-часть надписей становится белой.

Я просто попробовал следующее.

  • Нарисуйте 2 текстуры (фон и отличительные знаки)
  • Добавить glBlendFunc для применения альфа-значения декалей
#version 330 core

in vec2 UV;

out vec3 color;

uniform sampler2D background;

in      vec3      decalCoord;
uniform sampler2D decal;

void main(){

    vec3 BGTex     = texture( background, UV ).rgb;
    vec3 DecalTex  = texture(decal, decalCoord.xy).rgba;

    color = 
    vec4(BGTex,1.0) +   // Background texture is DDS DXT1 (I wonder if DXT1 is the cause?)
    vec4(DecalTex,0.0); // Decal texture is DDS DXT3 for alpha

}
// Set below...
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);

enter image description here

Мне удалось нормально рисовать, но есть следующие проблемы. -Альфа часть надписей не может быть прозрачной.

Это проблема, которую можно решить с помощью фрагментированного шейдера? В таком случае, как мне переписать код?

Текстура DDS, одна из которых имеет тип DXT1 (Фон. Поскольку этой текстуре не требуется альфа), а другая - тип DXT3 (Decal). Это тоже причина? (Оба должны быть типа DXT3?)

Кроме того, я должен искать другой способ надеть наклейки?

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

DecalTex имеет альфа-канал.Альфа-канал «вес», который указывает на интенсивность DecalTex.Если альфа-канал равен 1, то должен использоваться цвет DecalTex, если альфа-канал равен 0, то должен использоваться цвет BGTex.
Использовать mix чтобы смешать цвета BGTex и DecalTex в зависимости от альфа-канала DecalTex.Конечно, тип DecalTex должен быть vec4:

vec3 BGTex     = texture( background, UV ).rgb;
vec4 DecalTex  = texture(decal, decalCoord.xy).rgba;

color = vec4(mix(BGTex.rgb, DecalTex.rgb, DecalTex.a), 1.0);

Обратите внимание, mix linear интерполирует между двумя значениями:

mix(x, y, a) = x * (1−a) + y * a

Это похоже наоперация, которая выполняется функцией смешивания и уравнением:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);

Но Смешивание применяется к выходному фрагментному шейдеру и текущему значению в буфере кадров.
Вам вообще не нужно смешивать, потому что текстуры «смешиваются» в фрагментном шейдере, а результат помещается в кадровый буфер.Поскольку альфа-канал выходного фрагмента шейдера> = 1.0, выходной сигнал полностью «непрозрачный».

2 голосов
/ 26 июня 2019
  1. DecalTex должно быть vec4, а не vec3.В противном случае альфа-значение не будет сохранено.

  2. Вам также придется изменить строку в конце на: color = vec4(BGTex, 1.0) + DecalTex * DecalTex.a Поскольку в настоящее время для альфа-компонента установлено значение 0.

...