Замена GL_ALPHA_TEST в OpenGL ES 1.1 (без шейдеров) - PullRequest
1 голос
/ 03 марта 2011

Так что похоже, что производительность GL_ALPHA_TEST на iOS очень низкая.Процитируем Apple :

Графическое оборудование часто выполняет тестирование глубины в начале графического конвейера, прежде чем вычислить значение цвета фрагмента.Если ваше приложение использует альфа-тест в OpenGL ES 1.1 или инструкцию discard в фрагментном шейдере OpenGL ES 2.0, некоторые аппаратные оптимизации буфера глубины должны быть отключены.В частности, для этого может потребоваться, чтобы цвет фрагмента был полностью рассчитан только для отбрасывания, поскольку фрагмент не виден.

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

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

Мне интересно: что именно они подразумевают под "использованием альфа-смешивания с альфа-переключением в ноль".Как вы можете сделать это?В качестве альтернативы, есть ли другой способ пропустить / скрыть пиксели, основываясь на их альфа-значении?

Я рассмотрел использование объединителей текстур или различных режимов наложения (включая glBlendFuncSeparateOES).Тем не менее, ничто не кажется правильным для работы.Я полагаю, что иметь отдельную альфа-текстуру и использовать объединители текстур можно.Я действительно предпочел бы иметь только одну текстуру.

1 Ответ

1 голос
/ 09 апреля 2011

Проблема глубока и связана с буфером глубины. Вы можете установить альфа на ноль в коде шейдера, но вы все равно будете выводить фрагмент глубины, так что это лишь частичный обходной путь, в зависимости от причины использования альфа-теста. Таким образом, вы можете сместить альфа и масштабировать на большое число (чтобы избежать ответвления шейдера), а затем зажать, и вы получите четкое очерченное ребро альфа-теста, но прозрачные пиксели все равно будут заполнять zbuffer, что, если вы и используете эту причину, до сих пор не лучше. Вы не можете обойти основную проблему в шейдере. Вы можете настроить свой контент, чтобы свести к минимуму это и, возможно, нарисовать непрозрачный непроверенный z и сделать альфа-тестирование прозрачности последним. Детали того, как это влияет на z, могут очень сильно зависеть от платформы к платформе. На некоторых платформах оптимизации zbuffer, такие как ранние z и грубые z, могут быть отключены навсегда до следующей очистки, поэтому при задержке альфа-теста вы можете повысить производительность, но на самом деле все зависит от деталей реализации.

Отрегулируйте рисунок так, чтобы минимизировать прозрачные фрагменты, и используйте альфа-тест как можно позже при рендеринге, если этого нельзя избежать.

Также, если у вас есть функция сброса, используйте ее в конце вашего шейдера против постоянного альфа-теста, это может быть нелогично, но некоторые реализации оптимизируют этот сброс альфа-теста для использования оборудования с фиксированной функцией, которое лучше, чем ветвь шейдера ( на некоторых платформах). Опять же, это действительно зависит от того, насколько сложным является управление потоком потоков графического процессора. Будущие платформы с эффективным ветвлением, вероятно, выиграют от этого раньше, в основном вы пытаетесь найти способ использовать скрытые оптимизации реализации, которые различаются для разных платформ и будут меняться в будущем.

...