Я пытаюсь воспроизвести эффект светящегося контура в игре Left 4 Dead. Эффект заставляет контур объекта светиться, даже когда объект закрыт. Вот скриншот эффекта:
Я в некоторой степени могу повторить этот эффект в моей программе на основе OpenGL. Вот что я сейчас делаю:
- Создайте текстуру цвета и глубины, равную половине размера экрана, для рендеринга светящихся объектов.
- Очистить цвет свечения / текстуры глубины. Цвет очищается до черного.
- Для каждого светящегося объекта визуализируйте его в текстуру свечения в виде сплошного цвета.
- Выполните раздельное гауссово размытие на текстуре свечения
- Рендеринг сцены с полным разрешением как обычно
- Аддитивно смешайте текстуру свечения с обычной сценой, но используйте текстуру глубины свечения, чтобы замаскировать объект, оставляя только размытый контур.
Вот скриншот моего подхода:
Вот фрагментный шейдер, который комбинирует текстуру свечения со сценой:
uniform sampler2D glowColorTex;
uniform sampler2D glowDepthTex;
uniform sampler2D sceneColorTex;
void main()
{
vec2 uv = gl_TexCoord[0].st;
vec4 color = texture2D( sceneColorTex, uv);
float depth = texture2D( glowDepthTex, uv).r;
if(depth == 1.0) {
color += 2.0 * texture2D( glowColorTex, uv);
}
gl_FragColor = color;
}
Как видите, похоже, что это работает по большей части, но наложение на контуре действительно плохо.
У кого-нибудь есть предложения по сглаживанию внутреннего края контура?
Должен ли я выбирать соседние значения глубины каждого пикселя и масштабировать свечение, основываясь на количестве значений глубины, равных 1,0?
Или есть лучший подход, который даст более плавные результаты?