여러 명령어가 중첩되어 프로그램이나 하나의 작업을 실행하게 도와주는 과정
한 사이클 안에 들어가야 해서 과정이 많기 떄문에 한 사이클이 복잡해지거나 사용자 입장에서 어려워질 수 있다는 단점
Input Assembler , Vertex Shader, Rasterizer, OutputMerger 단계만 거쳐도 이상없이 화면에 나올 수 있다.
3차원 모델을 3차원 세상에 나타내기 위해 가장 먼저 해야할것은?
3차원 데이터를 2차원 모니터에 출력하는 것을 도와주는 하드웨어 - GPU
CPU vs GPU
CPU는 ALU라는 장치가 많지 않지만 하나의 연산장치가 빠르고 정밀한 계산가능
GPU는 ALU가 무수히 많게 존재하고 병렬적으로 처리하는데 유리하게 설계
3차원 모델은 점(vertex)로 이루어져 있고 이것을 폴리곤(점들의 집합)이라고 한다.
게임에서는 주로 삼각형을 이용해 3D 폴리곤을 정의하는데 이때 정점 데이터들을 운반하는 자료구조를 Vertex Buffer라고 한다.
ex) 사각형을 삼각형 기반으로 그리려면 2*3 = 6개의 정점이 필요
사각형을 구성하는 점점 4개만 두고 그려주는 방식을 사용
정점은 위치데이터 말고도 색, 법선, 텍스처좌표(UV), 애니메이션에 필요한 정보등 여러가지 데이터를 추가해 사용하기에 단순히 정수만 저장하는 인덱스 버퍼가 메모리적으로 효율적이다.
Vertex Buffer는 정점들의 연속적인 메모리 구조에 불과하기에 실제로 GPU에서는 이러한 정점들을 이용해 어떤 도형을 만들어야 하는지에 대한 정보가 필요하고 해당 도형정보를 Primitive Topology라고 한다.
Input Assembler 는 이런 정점들의 데이터를 읽고 삼각형과 같은 도형으로 조립하는 단계의 일을 한다
Input Assembler 에서 받은 정점정보들의 정보로 도형은 생성 되었지만 로컬 좌표계(자신이 중점인 좌료)에 있기 때문에 해당 데이터들을 화면에 그대로 출력하면 화면의 중심부에 전부 출력되기 때문에 공간좌표계(world)로 변환할 필요가 있다.
Local space 에서 World space 로 변환이나 실제 플레이어가 바라보는 카메라가 중심이 되는 공간 (View Space)으로 변환을 해준다. 그리고 마지막으로 3차원 데이터로 존재하는 것을 2차원 픽셀 데이터로 가공하는 마지막 단계를 projection 변환을 거쳐 최종적으로 정의된 ClipSpace라는 공간으로 변환을 해준다.
Local Space라고 불리는 오브젝트 공간은 3차원 세상에서 표현될 각각의 개인의 공간에 정의된 영역이다.
월드 변환이 완료되어 모든 물체가 한공간에 모아지면 이제 우리가 원하는 시점에서 물체를 볼 수 있게 해줘야 한다. 이때 관찰자로써 가상의 카메라가 필요하고 이 카메라로 볼 수 있는 영역의 공간을 뷰 공간이라고 한다.
월드 공간의 모든 물체를 카메라 공간으로 변화하게 된다면 효율적으로 여러가지 효과나 렌더링 등을 진행할 수 있게 된다.
가상의 카메라는 컴퓨터 성능의 한계 때문에 실제 세상과는 다르게 시야가 제한 될 수 있다. FOV(시야각), ASPECT(종횡비)에 의해 결정되는데 이러한 가시 영역을 뷰 볼륨이라고 한다. 이렇게 생성된 뷰 볼륨에 Near,Far 정보가 전달되어 절두체의 영역을 다시 정의한다.
절두체 공간 밖에 있는 물체는 그리지 않는데 계산상의 효율성을 위해 도입된 개념이다. 만약 물체가 절두체의 경계에 걸치게 되면 바깥부분은 잘려서 버리게 된다. 이를 클리핑(Clipping)이라고 한다. 이 클리핑은 카메라변환에서 이뤄지지 않고 나중에 클립공간에서 레스터라이저로 넘겨질때 수행된다.
카메라 변환에서 월드의 모든 물체를 카메라 공간으로 재배치하고 카메라를 통해 바라보는 가상의 공간은 3차원이지만 최적으로 우리가 바라봐야할 공간은 2차원 공간의 세계가 되어야 한다. 3차원 공간을 어떻게 2차원으로 표현할 수 있을까? - 원근법을 이용
투영 변환은 이러한 원근법을 구현하기 위해 카메라 공간에서 정의된 절두체를 3차원 클립공간으로 변환하는 것을 의미
여기서 투영 변환이라는 이름과는 다르게 3차원 공간의 물체를 2차원 평면으로 바꾸는 것이 아니라 3차원 물체로 변형됨에 주의
이런 투영 변환을 거친 물체들의 절두체 뒤쪽 영역의 폴리곤은 상대적으로 작아진다.
직육면체 볼륨으로 물체들을 변환해주는데 좀 더 간단한 공식으로 클리핑 작업을 할 수 있기 때문
테셀레이터는 다각형을 겹치지 않고 작게 만들어 실제에 보다 가깝게 표현할 수 있게 도와주는 기술
꼭 해야될 과정은 아니고 애초에 게임 제작할 때 메쉬를 2종류로 제작해줌 (정점이 많은 하이폴리곤, 정점이 적은 로우폴리곤)
HullShader -> Tesselation -> DomainShader 3단계로 구성
Vertex Shader에서 공간변환을 하지 않고 Hullshader 정점정보들을 전달해준다.
Hullshader는 폴리곤을 어떻게 분활할 것인가? 폴리곤을 얼마나 분활할 것인가? 를 결정
테셀레이터가 출력한 정점마다 한 번씩 함수(셰이딩 언어) 호출
기존의 정점셰이더에서 수행한 것들을 도메인 셰이더에서 수행
ex) 공간변환(월드 -> 뷰 -> 투영) 실행
꼭 해야될 과정은 아니다.
기본 폴리곤에서 정점을 추가하거나 삭제하거나 하는 연산을 할 수 있다. 정점 정보를 추가하여 표현 할 수 있는 모델이라면 그만큼 정점 정보를 빼고 저장할 수 있어 메모리적으로 이득, GPU 도움 받아서 정점을 추가하기 때문에 연산속도가 빨라질 수 있다.
ex) 특수효과(particle effect) - 하나의 물체만 저장하고 위치,색등을 변경해 표현
정점들은 삼각형으로 묶여있는데 이 시점부터 하나의 독자적인 도형으로 처리됨
우선 화면에 그려질 2차원 삼각형의 세 정점이 결정되면 다음과 같은 일이 일어난다.
DirectX에서는 이러한 과정을 통틀어 Rasterization이라 부르고 고정 파이프라인 단계로 프로그래머가 이러한 로직들을 임의로 바꿀 수 없는 파이프라인 단계이다. 자체 알고리즘으로 알아서 동작한다.
클리핑
클립공간 바깥에 놓인 폴리곤들을 잘라내는 작업, 래스터라이제이션에서 일어남
원근 나눗셈(perpective division)
투영변환까지 이루어진 물체가 클리핑 공간에 있음
3차원 공간을 2차원 공간으로 어떻게 옮길까?
Z좌표의 모든 성분을 나눠버리면 된다. 투영변환을 마친 정점 데이터는(x,y,z,w)이고 w성분에 z값이 들어있다. 원근 나눗셈이 적용된 이후 x,y,z 좌표계로 변환
이를 NDC(normalize device coordinate) 공간이라 부른다. 여기서 정규화 라는 이름이 붙는 이 좌표는 xy 범위는(-1~1) Z의 범위는 (0~1)이기 때문
뒷면제거 (backface culling)
카메라가 바라보는 방향에 물체에 가려진 면적을 굳이 연산할 필요가 없다. 외전(Cross product) 삼각형의 바라보고있는 면의 방향을 구하여 뒷면일 경우 제외한다.
스캔변환 (ndc scan transform)
이전의 변환들은 자세한 사항을 몰라도 프로그래밍하는데 문제가 없었지만 스캔 변환은 렌더링 프로그램에서 직접적인 영향을 미치기 때문에 중요
삼각형 하나가 내부에 차지하는 모든 픽셀들을 생성하는 작업이다. 이때 정점데이터에 들어온 데이터들은 보간(선형 보간)되어서 픽셀셰이더로 넘어간다.
뷰포트 변환
컴퓨터 화면상의 윈도우 스크린 공간을 갖는데 이 스크린 공간 내에 2차원 이미지가 그려질 뷰포트가 정의되는데 NDC공간의 문체들을 스크린 공간으로 이전시키는 변환
래스터화된 도형에 원하는 색을 입혀서 출력하게끔 도와주는 셰이더
텍스쳐매핑, 노말매핑 등 다양한 기법으로 색을 입혀서 표현도 가능
조명 처리나 이미지 처리를 할 때 유용
정점 데이터가 보간된 값이 넘어옴
어떻게 출력될지 프로그래머의 자율성에 맡김
Alpha Test, 깊이 테스트 2개의 단계에 걸쳐 물체를 최종적으로 어떻게 그려줄건지 정해주게 됨
깊이 - 스텐실 테스트와 블렌딩이 일어나서 최종적인 화면(텍스쳐)에 물체를 그려준다.
일반 렌더링 파이프라인과 별도로 그래픽카드를 사용할 때 실행할수 있도록 도와주는 셰이더
대량 병렬 알고리즘 또는 게임 렌더링의 일부를 가속화하기 위해 사용할 수 있음
효율적으로 사용하려면 GPU 아키텍쳐와 병렬 알고리즘에 대한 지식뿐 아니라 DirectX Compute, Opengl Compute, CUDA, OpenCL에 대한 지식도 필요
참고) https://www.youtube.com/watch?v=Wry5ltdrDQI&list=PLWKwcHKTXy5T5v_qSsvUnjFZG85pDOZPq