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

StackOverflow https://stackoverflow.com/questions/1320399

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );

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

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

if(texColor.w == 0.0)
    discard;

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top