2016-06-04 2 views
3

최근 내 SSAO 구현을 위해 노력 중이며, 앞으로 엔진과 지연 렌더러에 대한 지원을 추가하고 싶습니다. 따라서 깊이 전용 접근 방식을 사용하고 심도 맵에서 일반을 ​​재구성합니다. 코드는 다음과 같습니다. 가장자리에 인공물이없는 깊이에서 법선을 재구성하는 방법은 무엇입니까?

//Restore view space position with non-linear depth 
vec3 viewPos = getPosition(uv, depth, invProjMat); 
//Restore view space normal 
vec3 normal = normalize(cross(dFdx(viewPos), dFdy(viewPos))); 

가 그럼 난 내 SSAO 구현에이 정상을 적용, 그것은 가장자리를 제외하고, 대부분 아주 좋은 결과를 얻을 :

enter image description here

을 내가 그 가장자리에 있기 때문에 불연속 정상 확실 해요 , 그러나 나는 그것을 고치는 방법을 모른다. 깊이에서 정상을 재구성 할 때 가장자리에 인공물을 피하는 방법이 있습니까? 고마워.

enter image description here

+2

올바른 방법은 법선을 gbuffer로 렌더링하는 것입니다. 깊이 만 있으면 절대로 가장자리에서 잘 할 수 없습니다. 어떤 추론을 할 수는 있지만 항상 옳은 것은 아닙니다. 객체 uid를 렌더링하더라도 1 픽셀 너비의 선이 끊어집니다. 정말로 이것을하고 싶다면, dFd * 대신에 깊이에 기초한 필터를 만드십시오. dFdx (pos) 대신 값 (pos-1) - 값 (pos + 1)을 사용할 수 있습니다. 그리고 두 값이 너무 멀리 떨어져 있으면 다른 일을하는 필터를 만듭니다. 그러나 다시 예를 들어 하나의 픽셀을 음영 처리하면이 작업이 실패합니다. – starmole

+1

@starmole : 왜 대답이되지 않습니까? –

답변

2

는 완전히 법선으로 G-buffer를 생성 제외하고 모든 이슈를 제거하는 방법은 없습니다. 하지만 더 나은 결과를 얻을 수있는 법선을 재구성 할 수있는 솔루션이 있습니다.

내 엔진에서하는 일은 정상적인 재구성을 위해 5 가지 깊이 샘플을 사용합니다. 그들은 십자가와 같은 위치에 있습니다. 가운데 샘플은 현재 렌더링중인 픽셀이며 해당 샘플의 위, 왼쪽, 오른쪽 및 아래 픽셀을 샘플링합니다. 그런 다음 정상적인 재구성을 위해 가장 가까운 Y 샘플 (가운데 샘플 위 또는 아래의 샘플)과 가장 가까운 X 샘플 (중앙 샘플의 왼쪽 또는 오른쪽 중 하나)을 중심 샘플에 상대적으로 가져옵니다. 이것은 99 %의 케이스에서 정상적인 artifact를 제거하지만, 분기를 도입하고 텍스처 샘플을 더 필요로합니다. 따라서 이미 수행중인 작업을 수행하는 것보다 약간 느립니다.

고전 정상적인 재구성 : classic normal reconstruction

개선 (교차 패턴) 정상적인 재구성 : SSAO와 improved (cross pattern) normal reconstruction

고전 정상적인 재구성 : classic normal reconstruction with SSAO

개선 (교차 패턴) SSAO 정상 재구성 : improved (cross pattern) normal reconstruction with SSAO (내 구형 SSAO 스크린 샷 변명)

또한 명확하다, (값이 정확합니다 dFdx() 또는 dFdy()에 의해 반환한다는 하드웨어 보증이 없기 때문에) dFdx()dFdy()를 사용하는 것은 아마도 언제나 깊이 텍스처를 세 번 샘플링보다 더 많은 유물을 초래할 것이라는 점을 유의하시기 바랍니다 대소 문자를 구하십시오.

관련 문제