iPhone OpenGL ES:Применение теста глубины к текстурам с прозрачными пикселями для 2D-игры
-
19-09-2019 - |
Вопрос
В настоящее время у меня включены смешивание и глубинное тестирование для 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 в буфер глубины.