Композитная текстура с альфа-смешанными компонентами - PullRequest
0 голосов
/ 31 августа 2018

Todo:

  • Визуализация модели в нашем HUD,
    , но вместо рендеринга всех этих крошечных полигонов
    мы хотим оптимизировать и визуализировать эти полигоны в текстуру, а затем использовать эту текстуру как единый наложение полигона .

  • Это прекрасно работает, если вся визуализированная текстура имеет либо пустые пиксели, либо непрозрачные пиксели,
    , но когда у нас есть пиксели со значениями альфа от 0 до 1, мы получаем проблему.

  • например. скажем, у нас просто есть красный (1,0,0) многоугольник в нашей модели с альфа на 0,5.
    Если мы отрендерим это до текстуры, используя нормальное смешивание (SRC_ALPHA, 1-SRC_ALPHA), мы получим темно-красный цвет (0,5,0,0) и альфа при 0,5 .
    Когда это затем используется в качестве текстуры, оно намного темнее, чем должно быть, в основном потому, что красный многоугольник смешался с основой "черный" «текстуры.
    Неважно, на каком фоне это отображается, это неправильно.

Нам нужно, чтобы текстура имела полный красный (1,0,0) цвет и альфа-значение 0,5, но тогда это становится намного сложнее, когда мы визуализируем несколько альфа-смешанных многоугольников друг на друга.

Есть ли способ достичь этого?
Может быть, с другим режимом наложения экрана?
Это нужно сделать с помощью графического процессора во время рендеринга в текстуру.

Использование OpenGLES 2.0.

Пожалуйста, предложите.
Спасибо

Shaun

1 Ответ

0 голосов
/ 31 августа 2018

Наш художник нашел этот ответ. Хотя это не может быть идентично, это очень хорошо.

OpenGL рендерится в текстуру с частичной прозрачностью (прозрачностью) и затем выводит это на экран

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

Это работает, потому что, скажем, цвет (1, 0,5, 0,2) был добавлен к текстуре при 25% альфа, тогда цвет текстуры будет (0,25, 0,125, 0,05) и 0,25 альфа. Деление обратно на альфа 0,25 возвращает цвет (1, 0,5, 0,2), что нам и нужно.

Итак, только при использовании созданной текстуры, добавьте эту строку в конец вашего пиксельного шейдера

outcol.rgb / = outcol.a

Мы провели испытания с несколькими наложенными прозрачными пленками и не смогли определить разницу. Чем более непрозрачен цвет, тем меньше в нем исходного «черного с нулевым альфа». Он не требует никаких изменений в вашем конвейере рендеринга, кроме случаев, когда вы фактически используете созданную текстуру.

Shaun

...