Як я можу зменшити згладжування завдяки моєму ефекту світіння?


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?

Або є кращий підхід, який дасть плавніші результати?

Відповіді:


13

Можливо, замість того, щоб перевіряти його на буфер низької роздільної здатності, ви можете використовувати тест трафарету. Під час візуалізації нормальної сцени ви просто візуалізуєте об'єкт, який повинен світитися у буфер трафарету (я думаю, без глибокого тестування), а потім змішуєте повну текстуру світіння, але налаштовуєте тест трафарету лише на те, де знаходиться буфер трафарету не встановлено, тому маскує об'єкт високої роздільної здатності.

Таким чином ви отримуєте точний силует оригінального об'єкта, тоді як згладжування країв призведе лише до приблизних результатів, але, можливо, цього вам вистачить.


Дякую, що безумовно допомагає. Я сподівався на якусь техніку, яка підтримала б якусь форму протизшивання, але це все-таки важливе вдосконалення.
флешк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.