Sprite Opacity с использованием OpenGL ES 2.0 на Android
Я пытаюсь, чтобы мои точечные спрайты отображались с правильной непрозрачностью.
Первоначально я получал текстуру спрайта на черном квадрате.
Итак, я добавил следующее в мой фрагментный шейдер:
"if(color.a < 0.5) "+
"discard;"+
Теперь, похоже, это работает, так как мой спрайт отображается без черного фона, однако сама моя текстура "частично прозрачна" - и она не показывает эту частичную прозрачность, она выглядит сплошной. Это немного сложно объяснить, но я надеюсь, вы понимаете, о чем я. Если я рисую ту же текстуру, используя холст / вид поверхности, она отображается правильно.
По сути, я пытаюсь заставить свои текстуры отображаться в их оригинальном формате (то есть, как они делают в программном обеспечении, в котором они были созданы - т.е. Gimp / photoshop и т. Д.).
Буду признателен за любую помощь - спасибо
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)
чтобы избежать проблем с несортированными треугольниками.
Вы можете прочитать немного больше о прозрачности здесь.