개요 글로우 효과에서 앨리어싱을 줄이려면 어떻게해야합니까?


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

저해상도 깊이 버퍼에 대해 확인하는 대신 스텐실 테스트를 사용할 수 있습니다. 일반 장면을 렌더링 할 때 스텐실 버퍼에 빛을 내야하는 객체를 렌더링하고 (깊이 테스트하지 않고 생각) 완전한 광선 질감을 혼합하지만 스텐실 버퍼가있는 곳만 통과하도록 스텐실 테스트를 구성하십시오. 설정되어 있지 않으므로 고해상도 객체를 가리십시오.

이렇게하면 원본 객체의 정확한 실루엣을 얻을 수 있지만 가장자리를 부드럽게하면 대략적인 결과 만 얻을 수 있지만 충분할 수 있습니다.


고마워, 그것은 확실히 도움이됩니다. 앤티 앨리어싱의 일부 형식을 지원할 수있는 기술을 원했지만 이것이 여전히 중요한 개선입니다.
flashk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.