OpenGL - использование альфа-канала текстуры и «глобального» уровня непрозрачности - PullRequest
1 голос
/ 29 августа 2010

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 31 августа 2010
  • GL_MODULATE - это способ указать GL использовать альфа текстуры для конечной альфа фрагмента (это также по умолчанию).
  • Ваше смешивание также правильно относительно того, как использовать этот сгенерированный альфа на стадии смешивания.

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

Было бы легче убедиться в этом с изображением того, что вы наблюдаете.

1 голос
/ 30 августа 2010

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

uniform float alpha;
uniform sampler2D texture;
main(){
    gl_FragColor = texture2d(texture, gl_TexCoords);
    gl_FragColor.a *= alpha;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...