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

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

Левый - это то, что у меня есть. Правильно то, что я хочу

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

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

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 ); 

Мой fragmentарный шейдер:

 uniform sampler2D texture; varying vec2 texCoord; void main(){ gl_FragColor = texture2D( texture, texCoord ); } 

Должен ли я включать что-либо в манифест Android, чтобы включить альфа-тестирование? Я не хочу, чтобы мне пришлось вручную упорядочивать свои полигоны или использовать alpha discard (), потому что мне нужно и нужно, чтобы пиксели были полупрозрачными.

Как мне получить 3D-буферы глубины для тестирования?

Ниже представлен обзор нескольких методов рендеринга с прозрачностью в OpenGL с преимуществами и недостатками для каждого.

Альфа-тестирование

Это очень ограниченный метод, но этого достаточно для конкретного случая, о котором спрашивал плакат. Показанный пример действительно не требует прозрачности, потому что все либо полностью непрозрачно, либо полностью прозрачно (альфа = 1.0 или альфа = 0.0).

Для этой цели в OpenGL был альфа-тест, но это устаревшая функция и, конечно же, не в ES. Вы можете эмулировать одно и то же в своем шейдере fragmentа, который будет выглядеть примерно так:

 vec4 val = texture2D(tex, texCoord); if (val.a > 0.5) { gl_FragColor = val; } else { discard; } 

Преимущества:

  • Просто.
  • Никакой дополнительной работы на стороне приложения.

Недостатки:

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

Сортировка и смешивание

Переносимость прозрачности является основным вариантом использования для смешивания. Наиболее распространенный подход – установить функцию смешивания на SRC_ALPHA, ONE_MINUS_SRC_ALPHA , включить смешение и визуализацию с помощью альфа-компонента визуализированных fragmentов, содержащих желаемую непрозрачность.

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

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

Преимущества:

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

Недостатки:

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

Глубокий пилинг

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

  1. Сцена рендеринга с обычными настройками (включено тестирование глубины, функция глубины МЕНЬШЕ, цвет и глубина записи), но визуализируют только полностью непрозрачную геометрию. Если непрозрачность для одного объекта, вы можете справиться с этим, пропуская призывы рисования для непрозрачных объектов. В противном случае вам придется отказаться от непрозрачных fragmentов с помощью шейдера, аналогичного тому, что описано в Alpha Testing выше.
  2. Отметьте непрозрачную геометрию с теми же настройками, что и выше, за исключением того, что цветная запись отключена.
  3. Повторно отобразите непрозрачную геометрию, но на этот раз с функцией глубины EQUAL, цветная запись снова включена, глубина записи отключена и с помощью смешивания.

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

Преимущества:

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

Недостатки:

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

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

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

Преимущества:

  • Может обрабатывать полупрозрачность.
  • Правильно обрабатывает несколько уровней прозрачности.
  • Эффективно, особенно если MSAA все равно будет использоваться. Не требуется сортировка.

Недостатки:

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

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

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

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

  • Объявление float, почему default type double?
  • java рисует прямоугольник в одну сторону не одновременно
  • Как правильно переопределить toString () на Java?
  • Создайте новый TextView программно, затем отобразите его под другим TextView
  • Приемник как внутренний class в Android
  • android.content.res.Resources $ NotFoundException: Идентификатор ресурса строки # 0x0
  • Анонимные кодовые блоки в Java
  • Преобразование base64 в изображение в Java
  • eclipse с Android sdk, ERROR: пространство кучи Java
  • Создание приложения Android Lock Screen.
  • как разобрать JSONArray в android
  • Давайте будем гением компьютера.