Проблемы с Альфа-тестом OpenGL ES2

Я рендеринг в 3D нескольких объектов с текстурами, которые имеют альфа. Все текстуры загружаются нормально, но когда я пытаюсь отобразить их друг перед другом, я получаю следующее:

Left is what I have. Right is what I want

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

текстура перед текстурой красного круга обрезается. Я искал ответ, и он говорит мне использовать:

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, включить смешивание и визуализацию с Альфа-компонентом визуализируемых фрагментов, содержащих требуемую непрозрачность.

Если сцена содержит смесь полностью непрозрачных объектов и объектов с прозрачностью, полностью непрозрачные объекты могут быть сначала визуализируется, без необходимости их сортировки. Только объекты с прозрачностью должны быть отсортированы. Последовательность такова:

  1. визуализация полностью непрозрачной геометрии.
  2. визуализация непрозрачной геометрии, отсортированной назад к фронту.

плюсы:

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

недостатки:

  • требуется сортировка для правильного результата. Для функции blend, упомянутой выше, геометрия должна быть отрисована назад к фронту. В зависимости от приложения, это может быть между не большое дело и почти невозможно. Например, чтобы правильно отобразить пересекающуюся геометрию, вам может потребоваться начать разбиение треугольников, что далеко не привлекательно.

Глубина Пилинга

Это очень умное использование функций OpenGL, IMHO, и может быть хорошим практическим решением. Это требует нескольких рендеринг проходит. Простая форма предполагает 3 этапа:

  1. сцена рендеринга с обычными настройками (включено тестирование глубины, функция глубины меньше, цвет и глубина записи включена), но рендеринг только полностью непрозрачной геометрии. Если непрозрачность для каждого объекта, вы можете справиться с этим, пропуская вызовы draw для непрозрачных объектов. В противном случае вам придется отбросить непрозрачные фрагменты с шейдером, подобным к тому, кто проходит альфа-тестирование выше.
  2. отображать непрозрачные геометрии с теми же настройками, что и выше, за исключением того, что цвет отсутствует.
  3. снова визуализируйте непрозрачную геометрию, но на этот раз с функцией глубины равной, цветная запись снова включена, глубина записи отключена и используется смешивание.

минимальный шейдер можно использовать для прохода 2, так как ему не нужно создавать какой-либо допустимый фрагмент цвета.

плюсы:

  • прост в реализации.
  • разумно эффективный, не требует сортировки.
  • правильно обрабатывает полупрозрачность.

недостатки:

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

Альфа для покрытия

Я не использовал это сам, поэтому следующее основано на моем ограниченном теоретическом осмыслении. Похоже, это еще один интересный метод. Это требует отрисовки с несколькими выборками. Функция включена с помощью glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE), который затем преобразует Альфа-значения в маску покрытия, в результате чего только части образцов записываются в зависимости от Альфа-значения. Это приводит к эффекту прозрачности, когда буфер с несколькими образцами понижается до конечного цветового буфера.

плюсы:

  • может обрабатывать полупрозрачность.
  • правильно обрабатывает несколько слоев прозрачности.
  • эффективный, особенно если MSAA был бы использован в любом случае. Нет сортировки требуемый.

недостатки:

  • требуется MSAA. Современные графические процессоры очень эффективны при рендеринге MSAA, поэтому это не имеет большого значения. Часто вы, вероятно, захотите использовать MSAA в любом случае.
  • эффективное разрешение Альфа-значения очень мало, если я что-то не упускаю. Например, с 4x MSAA можно представить только 5 возможных Альфа-значений (0, 1, 2, 3, 4 образцы, установленные в маске покрытия).

принятый ответ не покрывает его.

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

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