Как я могу уменьшить наложение в моем эффекте свечения контура?

42

Я пытаюсь воспроизвести эффект светящегося контура в игре 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?

Или есть лучший подход, который даст более плавные результаты?

flashk
источник

Ответы:

13

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

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

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