11. GEOMETRY SHADER
Vertex Shader
월드 변환
Geometry Shader
시야 투영 변환
Triangle Assembly
• GS는 기존의 기하 모델을 수정 및 추가할 수 있는 쉐이더이다.
Original Model
12. GEOMETRY SHADER
Vertex Shader
월드 변환
Geometry Shader
시야 투영 변환
Triangle Assembly
삼각형을 이루는
버텍스 3개
• 버텍스 쉐이더에서 출력한 버텍스를 프리미티브(삼각형, 선, 점 중 선택)로 묶어 처리한다.
• 즉, 프리미티브 1개 당 한번 호출된다.
삼각형을 이루는
버텍스 6개
Original Model
13. GEOMETRY SHADER
Vertex Shader
월드 변환
Geometry Shader
시야 투영 변환
Triangle Assembly
삼각형을 이루는
버텍스 3개
• 버텍스를 추가/제거하거나 기존 버택스 위치를 수정하여 새로운 형태의 폴리곤을 만
들 수 있다.
삼각형을 이루는
버텍스 6개
Original Model
14. GEOMETRY SHADER
Vertex Shader
월드 변환
Geometry Shader
시야 투영 변환
Triangle Assembly
삼각형을 이루는
버텍스 3개
• 여기서는 큐브 맵을 한번의 처리로 렌더링 하는 데 사용한다.
삼각형을 이루는
버텍스 6개
Original Model
15. 그림자 맵(깊이 버퍼)
• 그림자 맵에 저장된 데이터는 광원기준으로 원근 투영된 후 ndc 공간으로 변환된 z
값이다. 따라서 0과 1 사이 값으로 저장된다.
• 그림자 맵을 가시화하면 아래와 같이 회색조의 이미지를 볼 수 있다.
16. 그림자 매핑의 과정
• Two pass algorithm
Shadowmap Rendering
Vertex Shader Geometry Shader Pixel Shader
Scene Rendering
Vertex Shader Pixel Shader
17. 그림자맵 생성
• 큐브맵을 텍스처 배열에 묶어 생성한다.
• 텍스처 배열을 이용하면 gpu가 모든 큐브맵에 접근할 수 있다.
Texture Array
Binding
18. 그림자 맵 렌더링
• 생성된 큐브맵을 렌더타겟으로 설정하고 렌더링 한다.
BACK BUFFER
렌더타겟
19. 그림자 맵 렌더링
• VS는 버텍스를 월드 변환하고 GS에 넘겨준다.
Vertex Shader Geometry Shader Pixel Shader
월드 변환
20. 광원 공간 뷰 투영
• 쉐도우 맵을 렌더링하기 위해선 카메라 기준이 아닌 광원 공간 뷰 투영 변환을 해야한다.
21. 광원 공간 뷰 투영
• 기존 그림자 매핑에서는 하나의 삼각형에 대해서 1번의 투영 변환만 하면 됐다.
• 그러나 포인트라이트는 빛이 전방위로 퍼져나가는 데 컴퓨터는 그림자 어느 면에 생성될
지 알 수 없다. 따라서 모든 면에 대해 투영 변환을 하여 6개의 삼각형을 출력한다.
한 면만 그림자 생성
두 면에 그림자 생성
22. 광원 공간 뷰 투영
• 사실 삼각형의 그림자가 6면 전부에 생성되지는 않는다. 최대 3면에 그림자 생성된다. 그
림자가 존재하지 않는 면은 그래픽스 파이프라인 단계를 거치면서 컬링된다.
한 면만 그림자 생성
두 면에 그림자 생성
컬링
컬링
컬링
컬링
컬링
23. 그림자 맵 렌더링
• GS에서 출력된 삼각형 중 컬링되지 않은 큐브맵 면에 깊이값이 저장된다.
Vertex Shader Geometry Shader
월드 변환 시야+투영 변환
Texture Array
24. 그림자 맵 렌더링
• PS는 알파값 기반 투명 패턴을 가진 기하 구조에만 쓰이고 보통 사용하지 않는다.
Vertex Shader Geometry Shader Pixel Shader
월드 변환 시야+투영 변환
25. 장면 렌더링
• 이제 렌더타겟을 백버퍼로 설정하고 장면을 렌더링 한다.
BACK BUFFER
렌더타겟
26. 장면 렌더링
• 장면 렌더링은 PS에서 그림자 맵을 그림자를 적용하는 데 사용한다.
Vertex Shader Pixel Shader
Texture Array
월드/시야/투영 변환 조명 계산
그림자 매핑
27. 그림자 매핑
• 먼저 광원에서 현재 픽셀 위치에 대한 벡터 𝑉로 부터 큐브맵에 저장된 깊이값을 가져온다.
• 이 깊이값과 광원에서 현재 픽셀 위치까지의 깊이값을 비교하여 그림자를 적용한다.
𝑉
참조할 텍셀
29. SHADOW MAP GENERATION
출력 삼각형은 6개로 최대 출력 버텍스는 18개 이다.
이 인덱스를 참고 하여 출력된 6개의 삼각형을 각각의 큐브맵 면에 업데이트한다.
삼각형 버텍스 추가
광원 공간 시야 투영 변환
출력할 삼각형 추가
텍스처 배열 인덱스 설정
30. 그림자 적용
조명 계산 생략
큐브 매핑에 필요한 벡터를 매개변수로 받는다.
이 반환 값은 최종 칼라의 감쇄 값으로 이용한다.
33. 포인트 세도우의 문제점
• 위에 방식은 GS에서 그림자 발생하지 않는 면이 존재함에도 6면 모두에 대한 삼각형을
출력한다. 플래그를 걸고 그림자가 발생하는 면의 삼각형만 출력하는 것도 하나의 방법
이지만 이를 위해선 cpu 단에서 큐브맵에 대한 컬링 테스트를 해야 하는데 이 비용이 만
만치 않다.
한 면만 그림자 생성
두 면에 그림자 생성
34. 포인트 세도우의 문제점
• 배보다 배꼽이 클 수 있으니 6개 출력을 그대로 하고 큐브맵을 적용할 모델을 최소화하
는 것이 낫다. 다만 특수한 경우에는 고려해보는 것도 좋을 것이다.
한 면만 그림자 생성
두 면에 그림자 생성