https://www.youtube.com/watch?v=ETDgyFRyT_8&list=PLWKwcHKTXy5T5v_qSsvUnjFZG85pDOZPq&index=2

[Tesselator 단계]

테셀레이터는 3단계로 구성되어 있다.

HullShader → Tesselation → DomainShader 단계를 거친다.

 

Hullshader는 테셀레이터 작업의 첫단계

->VertexShader에서 공간변환을 진행하지 않고 Hullshader 정점정보들을 전달

Hullshader 는 폴리곤을 어떻게 분활 할 것인가? 폴리곤을 얼마나 분할 할 것인가? 를 결정하는 단계

조금 더 사실적으로 표현하기 위한 방법- 정점의 개수를 늘림

[적용전]

[적용후]

테셀레이터는 다시 말해 다각형을 겹치지 않고 작게 만들어 빈틈을 없애 게임등에서 사물이나 인물등을 실제에 보다 가깝게 표현할수 있게 도와주는 기술

 

DomainShader는 테셀레이터가 출력한 정점마다 한 번씩 함수(셰이딩 언어) 호출을 해주게 된다.

테셀레이션이 활성화 되면 기존의 정점쉐이더에서 수행한 것들을 도메인 셰이더에서 수행하게 된다.

예를들어 공간변환(월드 → 뷰포트 → 투상)이 될수 있다.

 

실제 게임을 제작 할떄는 정적이 적은 로우폴리곤과 정점이 많은 하이폴리곤 모델 두개를 따로 지원하는 경우 많다.

-> 자주 사용되는 기술은 아님.

여러가지 매쉬

[Geometry Shader]- 필수는 x

기본 폴리곤에서 정점을 추가하거나 또는 삭제 하거나 하는 연산을 할수 있다.

정점 정보를 추가하여 표현 할수 있는 모델이라면 그만큼의 정점정보를 뺴고 저장가능

-> 메모리적으로 용량을 적게 차지 할수도 있고 GPU 도움을 받아서 정점을 추가해주기 때문에 연산속도가 빨라 질수 있다.

같은 모델 2개 - 지오메트리 shader로 복사해오기
파티클 이벤트- 하나만 올려두고 지오메트리로 색, 위치바꾸기

[Rasterization]

정점처리 단계를 지난 정점은 다음 단계인 레스터라이저 단계로 넘어갑니다.

정점 - 삼각형 - 하나의 독자적 도형으로 처리된다.

우선 화면에 그려질 2차원 삼각형의 세 정점이 결정되면 다음과 같은 일이 일어납니다.

레스터라이저

  1. 이 삼각형이 포함하는 모든 픽셀마다 pixelShader(fragment shader-opengl)가 실행
  2. 삼각형의 세 정점에 할당 되었던 여러 데이터(pos, uv, normal, color)가 보간되어 삼각형 내부에 각 픽셀셰이더로 넘어옵니다.

정점 - 도형을 이루는 기본 - 나머지는 보간 

Directx에서는 이러한 과정을 통틀어서 레스터라이제이션

-> 고정 파이프라인 단계로 프로그래머 이러한 로직들을 임의 바꿀수 없는 파이프라인 단계

자체 알고리즘으로 알아서 동작을 한다.

대표적 레스터라이제이션의 역할을 나열해 보자면

  1. 클리핑
  2. 원근 나눗셈(perpective division)
  3. 후면 제거
  4. 스캔변환 
  5. 뷰포트 변환

[클리핑]

투영변환 이후의 클립공간 볼륨 바깥에 놓인 폴리곤들을 잘라내는 작업

가시부피안에 있는 것만 보이게

[원근 나눗셈]

현재 단계에서 투영변환을 통해 원근법이 적용된 3차원 물체들을 직육면체 클리핑 공간에서 정의되어 있다.

단순히 생각하면 3차원에서 2차원으로 차원을 줄이면 된다. 

동차좌표계 -> 일반좌표계

바로 Z좌표로 모든 성분을 나붜버리는거죠. 투영변환을 마친 정점데이터는 (x, y, z, w)에서 w성분에 z값이 저장된다. 원근 나눗셈이 적용 된 이후에는 x,y,z,w -> x,y,z의 좌표계로 변환되는데 이를 NDC(normailize device coordinate) 공간(동차좌표계 ->일반 좌표계 - 정규화 기기 좌표계 )이라고 부릅니다. 여기서 정규화라는 이름이 붙는 이 좌표의 xy 범위는 [-1 ~ 1] z의 범위는 [0~1]이기 때문

[후면 제거]

카메라가 바라보고 있는 방향에 물체에 가려진 면적은 굳이 연산을 할 필요가 없다.

외적(Cross product) 삼각형의 바라보고있는 면의 방향을 구하여 뒷면일 경우에 연산에서 제외 시킨다.

[뷰포트 변환]

컴퓨터 화면상의 윈도우 스크린 공간을 갖는데 이 스크린 공간 내에 2차원 이미지가 그려질 뷰포트가 정의되는데

NDC공간의 물체들을 스크린 공간으로 이전시키는변환을 뷰포트 변환

*[스캔 변환]

이전의 변환들은 자세한 사항을 몰라도 프로그래밍하는데 문제가 없었지만 이 스캔 변환은 렌더링 프로그램에서 직접적인 영향을 미치기 떄문에 꽤 중요하다.

삼각형 하나가 내부에 차지하는 모든픽셀(fragment)들을 생성하는 작업이다.

이때 정점데이터에 들어온 데이터들은 보간(선형 보간)되어서 픽셀셰이더로 넘어간다.

[Pixel Shader]

레스터화된 도형에 원하는 색을 입혀서 출력하게끔 도와주는 셰이더

텍스처매핑 , 노말매핑, 등등 기법으로 색을 입혀서 표현도 가능하다.

조명 처리나 이미지 처리를 할 때 유용하게 사용된다.

정점 데이터가 보간된 값이 넘어온다.

[Output merger]-알파테스트, 깊이테스트

깊이 - 스텐실 테스트와 블렌딩이 일어나서 최종적인 화면(텍스처)에 물체를 그려준다.

 

어느게 앞에 있는지에 따라 색이 달라질 것이다.
투명하다면 뒤에 색과 합쳐서

[Compute shader]- 부수적인 단계

병렬연산지원

일반 렌더링 파이프라인과 별도로 그래픽카드를 사용할때 실행할수 있도록 도와주는 셰이더

대량 병렬 GPGPU 알고리즘 또는 게임 렌더링의 일부를 가속시키기 위해서 사용 가능

효율적으로 사용 하려면 GPU 아키텍처와 병렬 알고리즘에 대한 지식뿐만 아니라 DirectxComput, Opengl Compute, CUDA, 또는 OpenCL에 대한 지식도 필요

'게임공부 > Directx11' 카테고리의 다른 글

[Directx11]4. 삼각형 그리기  (1) 2024.07.01
[Directx11]3.장치초기화  (0) 2024.06.27
[Directx11]2.초기설정  (0) 2024.06.26
[Directx11]그래픽스OT  (0) 2024.06.25
[Directx11]1. 렌더링 파이프라인-1  (0) 2024.06.19

+ Recent posts