Проблемы с Альфа-тестом OpenGL ES2
Я рендеринг в 3D нескольких объектов с текстурами, которые имеют альфа. Все текстуры загружаются нормально, но когда я пытаюсь отобразить их друг перед другом, я получаю следующее:
Левый-это то, что у меня есть. Правильно то, что должно быть. Сетка просто помогает визуализировать перспективу.
текстура перед текстурой красного круга обрезается. Я искал ответ, и он говорит мне использовать:
GLES20.glEnable( GLES20.GL_BLEND );
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );
но я используя его, он все еще не работает. Моя настройка, в которой я правильно разместил функцию onSurfaceCreated ():
GLES20.glClearColor( 0.75f, 0.85f, 1f, 1.0f );
GLES20.glEnable( GLES20.GL_BLEND );
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );
GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );
GLES20.glClearDepthf( 1f );
мой шейдер фрагментов:
uniform sampler2D texture;
varying vec2 texCoord;
void main(){
gl_FragColor = texture2D( texture, texCoord );
}
должен ли я включать что-либо в манифест Android, чтобы включить альфа-тестирование? Я не хочу в конечном итоге вручную организовывать свои полигоны или использовать alpha discard (), потому что мне нужно и хочу, чтобы некоторые пиксели были полупрозрачными.
как получить буферы глубины испытания Альфы 3D к работа?
2 ответов
вот обзор нескольких методов визуализации с прозрачностью в OpenGL, с преимуществами и недостатками для каждого.
Альфа-Тестирования
Это очень ограниченный метод, но достаточно для конкретного случая плакат поинтересовался. Показанный пример на самом деле не нуждается в прозрачности, потому что все либо полностью непрозрачно, либо полностью прозрачно (alpha = 1.0 или alpha = 0.0).
для этой цели в OpenGL был альфа-тест, но это устаревшая функция и, конечно, не в ES. Вы можете эмулировать то же самое в своем шейдере фрагментов, который будет выглядеть примерно так:
vec4 val = texture2D(tex, texCoord);
if (val.a > 0.5) {
gl_FragColor = val;
} else {
discard;
}
плюсы:
- простой.
- нет дополнительной работы на стороне приложения.
недостатки:
- работает только для полной непрозрачности / прозрачности, не может иметь дело с полупрозрачностью.
- может повредить производительность, потому что это обычно означает, что проверка глубины перед шейдером фрагментов должна быть отключена.
сортировка и смешивание
прозрачность рендеринга является основным случаем использования для смешивания. Наиболее распространенным подходом является установка функции наложенияSRC_ALPHA, ONE_MINUS_SRC_ALPHA
, включить смешивание и визуализацию с Альфа-компонентом визуализируемых фрагментов, содержащих требуемую непрозрачность.
Если сцена содержит смесь полностью непрозрачных объектов и объектов с прозрачностью, полностью непрозрачные объекты могут быть сначала визуализируется, без необходимости их сортировки. Только объекты с прозрачностью должны быть отсортированы. Последовательность такова:
- визуализация полностью непрозрачной геометрии.
- визуализация непрозрачной геометрии, отсортированной назад к фронту.
плюсы:
- может обрабатывать полупрозрачность.
- может обрабатывать несколько слоев прозрачной геометрии.
- рендеринг сам по себе очень эффективный.
недостатки:
- требуется сортировка для правильного результата. Для функции blend, упомянутой выше, геометрия должна быть отрисована назад к фронту. В зависимости от приложения, это может быть между не большое дело и почти невозможно. Например, чтобы правильно отобразить пересекающуюся геометрию, вам может потребоваться начать разбиение треугольников, что далеко не привлекательно.
Глубина Пилинга
Это очень умное использование функций OpenGL, IMHO, и может быть хорошим практическим решением. Это требует нескольких рендеринг проходит. Простая форма предполагает 3 этапа:
- сцена рендеринга с обычными настройками (включено тестирование глубины, функция глубины меньше, цвет и глубина записи включена), но рендеринг только полностью непрозрачной геометрии. Если непрозрачность для каждого объекта, вы можете справиться с этим, пропуская вызовы draw для непрозрачных объектов. В противном случае вам придется отбросить непрозрачные фрагменты с шейдером, подобным к тому, кто проходит альфа-тестирование выше.
- отображать непрозрачные геометрии с теми же настройками, что и выше, за исключением того, что цвет отсутствует.
- снова визуализируйте непрозрачную геометрию, но на этот раз с функцией глубины равной, цветная запись снова включена, глубина записи отключена и используется смешивание.
минимальный шейдер можно использовать для прохода 2, так как ему не нужно создавать какой-либо допустимый фрагмент цвета.
плюсы:
- прост в реализации.
- разумно эффективный, не требует сортировки.
- правильно обрабатывает полупрозрачность.
недостатки:
- простая форма рисует только передний слой прозрачной геометрии. Это может показаться серьезным ограничением, но результаты могут выглядеть очень хорошо. Существуют более продвинутые формы, в которых дополнительные слои отображаются с помощью дополнительные проходы. Помимо накладных расходов для этих дополнительных проходов, он также становится более сложным, поскольку требует нескольких буферов глубины. Я считаю, что есть белая бумага об этом на веб-сайте NVIDIA.
Альфа для покрытия
Я не использовал это сам, поэтому следующее основано на моем ограниченном теоретическом осмыслении. Похоже, это еще один интересный метод. Это требует отрисовки с несколькими выборками. Функция включена с помощью glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE)
, который затем преобразует Альфа-значения в маску покрытия, в результате чего только части образцов записываются в зависимости от Альфа-значения. Это приводит к эффекту прозрачности, когда буфер с несколькими образцами понижается до конечного цветового буфера.
плюсы:
- может обрабатывать полупрозрачность.
- правильно обрабатывает несколько слоев прозрачности.
- эффективный, особенно если MSAA был бы использован в любом случае. Нет сортировки требуемый.
недостатки:
- требуется MSAA. Современные графические процессоры очень эффективны при рендеринге MSAA, поэтому это не имеет большого значения. Часто вы, вероятно, захотите использовать MSAA в любом случае.
- эффективное разрешение Альфа-значения очень мало, если я что-то не упускаю. Например, с 4x MSAA можно представить только 5 возможных Альфа-значений (0, 1, 2, 3, 4 образцы, установленные в маске покрытия).
принятый ответ не покрывает его.
в вашем случае решение состоит в том, чтобы отключить тестирование глубины и, возможно, изменить порядок, который вы рисуете.
шейдер отбросить, что будет выглядеть ужасно, если вам нужен диапазон значений Альфа.