Композитная текстура с альфа-смешанными компонентами
Сделать:
Рендеринг модели на нашем 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 ответ
Наш художник нашел этот ответ. Хотя это не может быть идентично, это очень хорошо.
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