iPhone OpenGL ES: применение теста глубины для текстур с прозрачными пикселями для 2D-игры - PullRequest
2 голосов
/ 24 августа 2009

В настоящее время у меня включено смешивание и тестирование глубины для 2D-игры. Когда я рисую свои текстуры, «верхняя» текстура удаляет некоторую часть нижних текстур, если они пересекаются. Ясно, что прозрачные пиксели текстур учитываются в тесте глубины, и он очищает все цвета нарисованных нижних текстур, если они пересекаются. Более того, альфа-смешения неправильно отображаются. Существуют ли какие-либо функции, которые могут указывать OpenGL не включать прозрачные пиксели в тестирование глубины?

Ответы [ 4 ]

3 голосов
/ 24 августа 2009
glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );

При этом все пиксели будут отброшены с альфа-значением, отличным от полностью непрозрачного. Эти пиксели не будут отображаться в Z-буфере. Это, однако, влияет на различные оптимизации конвейера Z-буфера, поэтому может привести к серьезным замедлениям. Используйте его, только если у вас действительно тоже.

2 голосов
/ 22 мая 2012

, если вы используете шейдеры, можете попробовать отключить смешивание и отбросить пиксели с альфа 0

if(texColor.w == 0.0)
    discard;
2 голосов
/ 24 августа 2009

Нет, это невозможно. Это относится ко всем аппаратным испытаниям глубины.

GL (полный или ES - и D3D) имеют одинаковую модель - они рисуют в порядке, указанном вами полигонов. Если вы рисуете многоугольник A перед многоугольником B, а логически многоугольник A должен быть впереди многоугольника B, многоугольник B не будет окрашен (любезно предоставлено тестом глубины).

Решение состоит в том, чтобы нарисовать полигоны в порядке от самого дальнего до ближайшего источника текущего вида. К счастью, в 2D-игре это должен быть простой вид (который вам, вероятно, даже не понадобится делать очень часто).

В 3D играх BSP являются основным решением этой проблемы.

0 голосов
/ 25 августа 2009

Какой тип смешивания вы используете?

glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Должен препятствовать записи любых фрагментов с альфа 0 в буфер глубины.

...