Я пытаюсь получить довольно простой эффект; Я бы хотел, чтобы у моих спрайтов была возможность использовать свои альфа-каналы в GL (то есть просвечивающие по всей части изображения, но не во всех), а также для всего спрайта иметь уровень «непрозрачности», который влияет на весь спрайт.
У меня есть последняя часть, это было достаточно простым делом использования GL_MODULATE и передачи color4d (непрозрачность, непрозрачность, непрозрачность, непрозрачность). Работает как сон.
Но проблема в первой части; частично полупрозрачные изображения. Я подумал, что могу просто выбросить glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); и включить смешивание, но, к сожалению, этого не происходит. Кажется, что он «отбеливает» цвет рассматриваемого изображения, а не делает его прозрачным. Любые другие спрайты, проходящие под ним, ведут себя так, как если бы это был сплошной цветовой блок, и его непосредственно обрезают.
Для справки я отключил освещение, z-буфер, цветной материал и альфа-тест. Делали тени модели плоскими, на всякий случай. Но кроме этого, я использую стандартные настройки орто. Я использую teximage2d для рассматриваемой текстуры, и я был уверен, что форматы и GL_RGBA все установлены правильно.
Как я могу заставить GL учитывать альфа-канал текстуры во время наложения?
Самое простое и быстрое решение — использовать фрагментный шейдер.
uniform float alpha;
uniform sampler2D texture;
main(){
gl_FragColor = texture2d(texture, gl_TexCoords);
gl_FragColor.a *= alpha;
}
Значит, проблема в другом... Ваше описание звучит так, будто вы на самом деле не отключили Z-тест и не рендерите свои спрайты задом наперед. Альфа-смешивание в GL будет делать то, что вы хотите, только если вы рисуете свои спрайты задом наперед. В противном случае спрайты смешиваются в неправильном порядке, и это не дает правильного результата.
Однако было бы легче проверить это с помощью картины того, что вы наблюдаете.