지연 렌더링의 그림자


12

지연 렌더링에 대한 자료를 읽었으며 그 요점을 알 것 같습니다. 그러나 내가 이해하지 못하는 것은 그림자를 달성하는 방법입니다. 내가 아는 한 G- 버퍼는 각 라이트에 대한 섀도 맵을 생성하는 것을 포함하지 않으므로 조명 패스가 각 픽셀의 폐색 여부를 어떻게 인식하는지 혼란 스럽습니다. 결국, 카메라의 관점에서 볼 수있는 주어진 픽셀은 주어진 빛의 관점에서 실제로 보이지 않을 수 있으며, 폐색 기하 구조는 카메라의 관점에서 보이지 않을 수 있으므로 G- 버퍼에 아무것도 기록되어 있지 않습니다. .

섀도우 맵 렌더링을 시작하면 포워드 렌더링과 거의 동일하게 보입니다. 모든 라이트에 대해 씬의 모든 지오메트리를 렌더링하여 섀도우 맵을 렌더링합니다.

그렇다면 지연 렌더링은 앞으로 렌더링과 같은 그림자를 어떻게 달성합니까?

답변:


14

디퍼 드 셰이딩은 그림자에 특별한 작업을 수행하지 않습니다. 그림자 맵을 정상적으로 렌더링 한 다음 적절한 그림자 맵을 텍스처로 바인딩하여 각 라이트를 렌더링해야합니다.

조명을 적용하기 위해 기본 뷰에서 장면을 다시 그릴 필요가 없으므로 정방향 렌더링보다 낫습니다. 쉐도우 맵을 그리는 것은 픽셀 쉐이딩을 할 ​​필요가 없기 때문에 메인 뷰에서 더 많은 패스를 그리는 것보다 훨씬 저렴합니다. 그리고 쉐도우 맵에는 종종 장면이 적습니다 (많은 것들을 제거 할 수 있음).

사람들은 때때로 하나의 빛, 일반적으로 주요 방향성 빛에 대해 "지연된 그림자"를합니다. 이를 수행하는 주된 이유는 계단식 섀도 맵 또는 동일한 라이트에 여러 섀도 맵을 사용하는 다른 방법을 사용하기 때문입니다. 섀도우 마스크를 위해 G- 버퍼에 하나의 채널을 예약하고 (점등 된 경우 흰색, 어두운 곳은 어둡게)이 계단식 섀도우 맵을이 G- 버퍼 채널에 적용 할 수 있습니다. 라이트의 쉐이더는 섀도 마스크를 읽고 라이트 컬러로 곱합니다. 그림자와 음영을 분리하기 때문에 좋지만 여전히 동일한 그림자 맵을 모두 그리는 중입니다.


1
매우 영리한 경우 GBuffer를 만드는 동안 지오메트리 셰이더를 사용하여 그림자 맵 생성을 '인라인'(예 : 큐브 맵 DX10 샘플처럼) 할 수 있습니다. 그것이 이루어 졌는지, 가능하다면 또는 결국 느려질 지 확실하지 않지만 그림자 맵의 생성 을 지연된 음영에 가깝게 만들 거나 종교에 따라 정의에 가깝게 만듭니다.
Jonathan Dickinson

6

그림자 맵이란 무엇입니까? 그림자 맵은 텍셀이 간단한 질문에 답변하는 텍스처입니다. 텍셀이 나타내는 방향을 따라 빛으로부터 어느 거리에서 빛이 가려 집니까? 텍스처 좌표는 특정 그림자 매핑 알고리즘에 따라 다양한 투영 텍스처링 수단을 사용하여 생성됩니다.

프로젝션 텍스쳐링은 단순히 오브젝트를 텍스처의 공간으로 변형시키는 방법입니다. 섀도 매핑 알고리즘은 여러 가지 다른 종류의 변환을 사용합니다. 그러나 궁극적으로 이것은 한 공간에서 다른 공간으로의 변환입니다.

그림자 맵을 렌더링 할 때 지오메트리의 꼭짓점을 가져 와서 표준 렌더링 파이프 라인을 통해 변환합니다. 그러나 카메라 및 프로젝션 매트릭스는 뷰 위치 및 방향이 아닌 조명 위치 및 방향에 맞게 설계되었습니다.

그림자 맵을 사용하여 정방향 렌더링을 수행 할 때 정점을 뷰 카메라 공간으로 그리고 뷰 영사 매트릭스를 통해 변환하여 객체를 정상적으로 렌더링합니다. 그러나 라이트 카메라와 프로젝션 매트릭스를 통해 정점을 변환하여 버텍스 당 데이터로 프래그먼트 셰이더에 전달합니다. 투영 텍스처링을 통해 그림자 텍스처에 액세스합니다.

중요한 점은 다음과 같습니다. 투영 텍스처 액세스는 텍스처에서 액세스하는 위치가 표면의 해당 지점 (조각 쉐이더에서 렌더링하는 지점)과 조명 사이의 방향을 나타내도록 설계되었습니다. 따라서 렌더링되는 조각에 대해 오 클루 전이 발생하는 깊이를 나타내는 텍셀을 가져옵니다.

그러나이 파이프 라인 에는 특별한 것이 없습니다 . 꼭짓점 위치를 그림자 질감으로 변환 할 필요는 없으며 조각 쉐이더에 전달할 필요가 있습니다. 월드 스페이스 버텍스 위치를 프래그먼트 셰이더로 전달한 다음, 프래그먼트 셰이더가 그림자 텍스처의 투영 공간으로 변환하도록 할 수 있습니다. 물론, 동일한 텍스처 좌표를 얻을 수 있기 때문에 많은 성능을 버릴 것입니다. 그러나 수학적으로 실행 가능합니다.

실제로 뷰 카메라 공간 정점 위치를 프래그먼트 셰이더로 전달할 수 있습니다. 그런 다음 월드, 라이트 카메라 공간, 투영 그림자 텍스처 공간으로 변환 할 수 있습니다. 그림자 투영 알고리즘에 따라 모든 변환을 하나의 행렬로 넣을 수 있습니다. 다시 말하지만, 이전과 정확히 동일하게 제공되므로 앞으로 렌더링 할 때는 그럴 이유가 없습니다.

그러나 지연 렌더링에서는 뷰 카메라 공간 정점 위치 가 이미 있습니다 . 그렇지 않으면 조명을 할 수 없습니다. 버퍼에 쓰면서 많은 메모리와 대역폭을 낭비했거나 깊이 버퍼와 다양한 수학을 사용하여 똑똑하고 재 계산했습니다 (여기서는 들어 가지 않지만 온라인으로 다룹니다).

어느 쪽이든 카메라 공간 위치를 볼 수 있습니다. 위에서 언급 한 바와 같이, 우리는 매트릭스를 적용하여 뷰 카메라 공간에서 그림자 투영 텍스처 공간으로 변환 할 수 있습니다. 그러니까 ... 그런 다음 그림자 맵에 액세스하십시오.

문제 해결됨.


지연 렌더링에서 조명 당 지오메트리를 제외 할 수 있습니까 (최적화를 위해)?
Samaursa

@Samaursa : "빛당 지오메트리 제외"란 무엇입니까? 그림자 맵으로 들어가는 것에서? 불이 붙었습니까?
Nicol Bolas

나는 당신이 그것에 관한 질문에 답변했습니다, 감사합니다. 다른 사람들을 위해 질문 / 답변을 따르고 싶다면 : gamedev.stackexchange.com/q/178755/2287
Samaursa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.