Я намагаюся повторити світиться ефект контуру в грі 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?
Або є кращий підхід, який дасть плавніші результати?