OpenGL - Использование альфа-канала текстуры И «глобальный» уровень непрозрачности

Я пытаюсь получить довольно простой эффект; Я бы хотел, чтобы у моих спрайтов была возможность использовать свои альфа-каналы в GL (то есть просвечивающие по всей части изображения, но не во всех), а также для всего спрайта иметь уровень «непрозрачности», который влияет на весь спрайт.

У меня есть последняя часть, это было достаточно простым делом использования GL_MODULATE и передачи color4d (непрозрачность, непрозрачность, непрозрачность, непрозрачность). Работает как сон.

Но проблема в первой части; частично полупрозрачные изображения. Я подумал, что могу просто выбросить glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); и включить смешивание, но, к сожалению, этого не происходит. Кажется, что он «отбеливает» цвет рассматриваемого изображения, а не делает его прозрачным. Любые другие спрайты, проходящие под ним, ведут себя так, как если бы это был сплошной цветовой блок, и его непосредственно обрезают.

Для справки я отключил освещение, z-буфер, цветной материал и альфа-тест. Делали тени модели плоскими, на всякий случай. Но кроме этого, я использую стандартные настройки орто. Я использую teximage2d для рассматриваемой текстуры, и я был уверен, что форматы и GL_RGBA все установлены правильно.

Как я могу заставить GL учитывать альфа-канал текстуры во время наложения?

1
задан Knetic491 29 August 2010 в 10:10
поделиться

2 ответа

Самое простое и быстрое решение — использовать фрагментный шейдер.

uniform float alpha;
uniform sampler2D texture;
main(){
    gl_FragColor = texture2d(texture, gl_TexCoords);
    gl_FragColor.a *= alpha;
}
1
ответ дан 2 September 2019 в 21:44
поделиться
  • GL_MODULATE — это способ указать GL использовать альфа-канал текстуры для финального альфа-канала фрагмента (это также значение по умолчанию).
  • Ваше смешивание также верно в отношении того, как использовать сгенерированную альфу на этапе смешивания.

Значит, проблема в другом... Ваше описание звучит так, будто вы на самом деле не отключили Z-тест и не рендерите свои спрайты задом наперед. Альфа-смешивание в GL будет делать то, что вы хотите, только если вы рисуете свои спрайты задом наперед. В противном случае спрайты смешиваются в неправильном порядке, и это не дает правильного результата.

Однако было бы легче проверить это с помощью картины того, что вы наблюдаете.

1
ответ дан 2 September 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: