Непрозрачность спрайтов с использованием OpenGL ES 2.0 на Android

Я пытаюсь заставить точечные спрайты отображаться с правильной непрозрачностью.

Изначально я наносил текстуру спрайта на черный квадрат.

Итак, я добавил в свой фрагментный шейдер следующее:

"if(color.a < 0.5) "+
               "discard;"+

Теперь это, кажется, работает, поскольку мой спрайт отображается без черного фона, однако сама моя текстура «частично прозрачна» - и она не показывает эту частичную прозрачность, она выглядит сплошной. Это немного сложно объяснить, но я надеюсь, вы понимаете, что я имею в виду. Если я рисую ту же текстуру, используя canvas/surfaceview, она отображается правильно.

По сути, я пытаюсь заставить свои текстуры отображаться в их исходном формате (т.е. как они отображаются в программном обеспечении, в котором они были созданы, т.е. в Gimp/Photoshop и т.д.).

Буду признателен за любую помощь - спасибо


person Zippy    schedule 21.03.2013    source источник


Ответы (1)


Сначала убедитесь, что ваши текстуры загружаются из прозрачных png-файлов через Bitmap с помощью RGBA_8888 или RGBA_4444, чтобы не потерять альфа-канал.

Во-вторых, вам нужно включить GL_BLEND с помощью команды glEnable(). На Android вы напишите это так: GLES20.glEnable(GLES20.GL_BLEND);. Это позволяет смешивать уже нарисованный цвет с новым цветом, добиваясь прозрачного вида. Функция смешивания должна быть установлена ​​на GL_ONE, GL_ONE_MINUS_ALPHA для обычного прозрачность: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA для обычной прозрачности: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Наконец, вам не нужно использовать отбрасывание, просто установите gl_FragColor в 4-компонентный вектор с альфа-каналом в четвертом канале (это то, что вы получаете при чтении текстуры из сэмплера), например. вы могли бы просто сделать gl_FragColor = texture2D(sampler, texCoord);, если бы захотели.

Вам, скорее всего, придется отключить проверку глубины с помощью glDisable(GL_DEPTH_TEST), чтобы избежать проблем с несортированными треугольниками.

Подробнее о прозрачности можно прочитать здесь.

person Jave    schedule 21.03.2013
comment
Спасибо @Jave, я воспользовался вашими предложениями, я удалил отбрасываемую часть шейдера фрагментов, и, хотя теперь нет черного ящика, он все еще выглядит неправильно - текстура теперь «прозрачная», но есть темный контур вокруг него и изображение более тусклое, чем должно быть - (слишком прозрачно??) Буду признателен, если у вас есть другие предложения - спасибо - person Zippy; 22.03.2013
comment
Я понял - мне нужно было использовать GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); вместе с вашим предложением - спасибо, что указали мне правильное направление! - person Zippy; 22.03.2013
comment
не будет ли прозрачность на основе альфа-канала glBlendFunc(GL_APLHA, GL_ONE_MINUS_SRC_ALPHA), из примера раздела документации, khronos.org/opengles/sdk/docs/man3/html/glBlendFunc.xhtml - person HPP; 16.07.2015