: 3차원 물체를 2차원으로 투영시키는 과정
→ 여러 명령어가 중첩되어서 프로그램이나 하나의 작업을 실행하게 도와주는 과정
한 사이클 안에 들어가야 하는데 과정이 많기 때문에 복잡해지거나 사용자입장에서 어려워질 수 있는 단점 존재
Rasterization
3차원 모델 하나를 3차원 세상에 나타내기 위해서 가장 먼저 해줘야할 것은?
여기서 모델은 점(vertex)로 이루어져있고 이 점들의 모임을 폴리곤이라고 한다.
주로 게임에서는 삼각형을 가지고 3D 폴리곤을 정의하는데, 이때 정점 데이터들을 운반하는 자료구조를 Vertex buffer라고 한다.
정점 버퍼(Vertex buffer)와 같이 등장하는 용어로 index buffer라는 것이 있다.
인덱스 버퍼는 쉽게 생각하면 정점들의 인덱스를 저장하고 있는 버퍼라고 할 수 있는데 사각형을 예를 들면 사각형을 (삼각형을 기반으로) 그리기 위해서는 2*3 = 6의 정점이 필요하다.
사각형을 구성하는 정점을 4개만 두고 한 분 그리기처럼 중복해서 그려주는 방식을 사용하는 걸 인덱스 버퍼의 기능이라고 생각할 수 있다.(없어도 상관은 x)
추가적으로 인덱스 버퍼를 사용하는데, 그것도 결국 메모리를 사용하니까 똑같다고 생각할 수 있으나
정점은 위치데이터 말고도 색깔, 법선, 텍스처좌표(UV), 애니메이션에 필요한 정보 등등 여러가지 프로그래머가 원하는 데이터를 추가하여 사용하기 때문에 단순히 정수만 저장하는 인덱스 버퍼가 훨씬 메모리적으로 효율적이다.
다시 정점버퍼로 돌아와서
정점버퍼는 그냥 정점들의 연속적인 메모리 구조에 불과 하기때문에 GPU에서는 이러한 정점들을 이용하여 어떤 도형을 만들어야하는지 정보가 필요하다.
해당 도형정보를 Primitive Topology라고 한다.
결론적으로 Input Assembler는 이런한 정점들의 데이터를 읽고 삼각형과 같은 도형으로 조립하는 단계의 일을 한다고 생각하면 된다.
input Assembler에서 반은 정점 정보들의 정보로 도형은 생성이 되었지만 로컬좌표계에 있기 때문에 해당 데이터들을 화면에 그대로 출력해버리면 화면의 중심부에 전부 그대로 출력되어버려서 월드 좌표계로 변환할 필요가 있다. 로컬 스페이스에서 월드 스페이스로의 변환이 필요하고, 실제 플레이어가 바라보는 카메라가 중심이 되는 뷰 스페이스 변환을 해준다. 그리고 마지막으로 Projection 변환을 거쳐 최종적으로 정의된 클립 스페이스로 변환을 해준다.
로컬 스페이스라고도 불리는 오브젝트 공간은 3차원 세상에서 표현될 각각의 개인의 공간에 정의된 영역이다.
월드 변환이 완료되어 모든 물체가 한 공간(World Space)에 모아지면 이제 우리가 원하는 시점에서 물체를 관찰할 수 있게 해줘야한다. 이때 관찰자로서 가상의 카메라가 필요하고, 이 카메라가 볼 수 있는 영역의 공간을 뷰 공간이라고 한다.
월드 공간의 모든 물체를 카메라 공간으로 변화하게 된다면 효율적으로 여러가지 효과나 렌더링 등을 진행할 수 있다.
카메라가 바라보는 시야를 생각했을 때, 가상의 카메라는 컴퓨터의 성능적 한계 때문에 실제 세상과는 다르게 시야가 제한될 수 있다. FOV(시야각), ASPECT(종횡비)에 의해 결정되는데 이러한 가시영역을 뷰 볼륨이라고 한다. 이렇게 생성된 뷰 볼륨에 Near,Far 정보가 전달되어 절두체의 영역을 다시 정의한다.
우리가 살고 있는 3차원 세상은 모든 걸 보여주는 절두체 공간 밖에 있는 물체는 그리지 않는다. 이유는 계산상의 효율성을 위해 어쩔 수 없이 도입된 개념이다. 만약 물체가 절두체의 경계를 걸치게 되면 바깥쪽 부분은 잘려서 버리게 되는데, 이를 클리핑(Cliping)이라고 한다. 이 클리핑은 카메라 변환에서 이루어지지 않고 나중에 클립 공간에서 레스터라이저로 넘겨질 때 수행된다. (-> 뒤에서 자세히 설명)
카메라 변환에서 월드의 모든 물체를 카메라 공간으로 재배치하고, 이제 카메라 시점에서 세상을 바라볼 수 있게 되었다. 우리가 카메라를 통해서 바라보는 가상의 공간이 현실 세계처럼 3차원이지만 최적으로 우리가 바라 봐야할 공간은 모니터 세상인(2차원)공간의 세계가 되어야 한다. 3차원 공간을 어떻게 2차원으로 표현할 수 있을까?
-> 정답은 원근법이랍니다ㅇㅅㅇ
투영 변환은 이러한 원근법을 구현하기 위해 카메라 공간에서 정의된 절두체를 3차원 클립공간으로 변환하는 것을 의미한다.
여기서 투영 변환이라는 이름과 다르게 3차원 공간의 물체를 2차원 평면으로 바꾸는 것이 아니라 3차원 물체로 변형됨에 주의
이러한 투영 변환을 거친 물체들을 관찰해보면 절두체 뒤쪽에 있던 영역의 폴리곤은 상대적으로 작아지는 것을 볼 수 있는데 우리가 원했던 원근법이 적용된 것이라고 볼 수 있다.
+) 원근법을 3차원 공간에서 실현하기 위해 직육면체 볼륨으로 물체들을 변환시켰는데 이렇게 하면 좀 더 간단한 공식으로 쉽게 클리핑 작업을 할 수 있다.
HullShader -> Tesse lation -> DomaionShader 단계를 거침
오 설명 쌈뽕하다
몰라 스왑체인 두 번 되면 UI 사라졌다 생겼다 반복함