Shader 입문 - GPU와 Shader 소개
Transform
그래픽스에서 가장 중요한 개념. 모든 객체의 위치, 방향, 크기를 결정하는 것이다.
Rendering Pipeline : 프로세스가 파이프라인처럼 연결 되어, 처리된 후 반대쪽으로 나오게 되는 작업 과정을 의미한다.
Transformation 과정에서 수학적 계산들을 거친다.
Local Space
Object 자체가 가지고 있는 공간.
FBX를 추출하면 해당 폴리곤 들은 원점을 기준으로 해서 Local Space기준으로 값들이 저장된다.
Max나 Maya같은 3D 그래픽 툴의 3D 데이터는 고유의 Local Space를 가지고 있다.
World Space
유일하게 존재하는 3D 공간.
폴리곤으로 구성되어 있는 오브젝트를 하나의 공간안에서 배치하여 절대적인 위치를 통해 서로 간의 관계를 형성한다.
- 이동 (Translation)
- 회전 (Rotation)
- 크기 (Size)
View Transform
게임 상에서 3차원 공간의 시점은 동적으로 변화가 가능하다.
3차원 공간에서 바라보는 기준은 카메라를 기준으로 한다.
- World Space에서 카메라가 바라보는 View Space로의 변화가 필요하다.
- 3차원 공간상에 오브젝트 배치 후, 카메라가 바라보고 있는 View Space로 이동한다.
Projection Transform
물리적 디스플레이의 2차원 공간 변환을 위해 Clip Space로 이동
기존 View Space에서 볼 수 없는 공간은 제거한다.
- 원근 투영 : 카메라와 가까울 수록 크기가 작아지는 투영방법
- 직교 투영 : 카메라 거리와 무관하게 동일 크기로 표현하는 투영방법
View Frustum
카메라에서 보이는 부분만 렌더링이 되는 영역.
구성 요소:
- Near Plane
- Far Plane
- FOV(Field Of View, 시야각)
Clip Space
기존 View Space에서 볼 수 없는 공간은 제거 하고 남은 공간이다.
정규화된 X,Y의 값은 -1부터 1사이의 값이며, Z값은 3D API별로 차이가 있다.
- DirectX, Metal의 Z값은 0부터 1사이의 값
- OpenGL의 Z값은 -1 ~1사이의 값
3D공간상에 존재하는 카메라의 Frustum에 의해 시야에 벗어난 요소들은 제거하고,
FOV를 적용하여, 정규화 시킨 공간이다.
Viewport Transform
(Viewport : 스크린 공간안에서 실제 오브젝트들이 렌더링 될 공간)
Clip Space에서 Screen Space로 이동하는 변환
Screen Space
지정된 디바이스 화면에 최종적으로 보이는 공간.
2D 화면 좌표계이며, 실질적으로 화면에 존재하는 픽셀로 변환하는 과정이다.
뷰포트에 의해 화면에 보이는 크기가 결정된다.
Transform
World Space > View Space, Camera Space > Projection Transform > Clip Space, Projection Space > Screen Space, Viewport Space
Unity에서의 Transform
- Local Space : Object 자체의 좌표 공간. FBX로 파일이 추출될 때 저장된 좌표 공간.
- World Space : 하나만 존재하는 3D 세계 공간
- View Space : 카메라가 바라보는 공간
- Clip Space : Object를 View의 크기에 따라 표현한 공간
- Screen Space : Clip Space공간을 이동시켜 화면의 픽셀로 표현
Unity 실습 진행
1. Unity Project 생성
2. Cube 생성 Scale 2.0으로 통일해서 (0, 0, 0)으로 위치
3. Main Camera의 Near와 Far Plane의 값을 수정 해 보기.
- Near의 값을 100으로 했을 때의 Cube가 보이는지 여부 확인.
Rendering Pipeline
Rendering : 화면에 그림을 그리는 것
Pipeline : 여러 단계로 구성되어 있는 구조
모니터 화면 상에 표현되는 그래픽적인 표현은 그래픽스 API를 통해서 제공된다.
DirectX & OpenGL
DirectX Basic Rendering Pipeline
Input assembler > Vertex Shader > Rasterizer > Pixel Shader > Output Merge
Input Assembler (IA)
그래픽 리소스들을 통해서 입력 데이터를 읽어서 정점 데이터들을 모으는 작업을 진행하는 단계.
Fixed Function Stage(고정 기능 단계)로 진행된다.
- 정점 버퍼,색인 버퍼들을 입력으로 받아서 정점 및 색인 정보를 생성한다.
- 정점 정보들만 있을 경우 어떤 기본 도형으로 렌더링할지 모르게 된다.
- 화면에 렌더링할 Geometry Primitive Topology를 지정한다.
- POINT LIST, LINE LIST, LINE STRIP(연결)
- TRIANGLE LIST, TRIANGLE STRIP(연결)
게임 프로그래밍에서 가장 많이 사용되는 기본 도형은 TRIANGLE STRIP.
결과로써 다음 단계인 Vertex Shader에게 정점 정보들을 제공한다.
- Position : 정점의 위치 값
- Normal : 정점의 법선 벡터 값
- Texture Coordinate (UV) : 정점의 텍스처 좌표 값
- Tangent : 정점의 접선 벡터
- 기타 등등
Vertex Shader
입력해서 들어온 정점 정보를 이용해서 출력 정점 정보를 구현한다.
- Input Assembler을 통해 전달된 기본도형에 대한 정보는 모름.
- 개별적으로 구성된 정점마다 독립적으로 계산.
- 기본 도형의 종류와 무관하게 동일한 연산을 수행한다.
- 기하학적 변환을 위한 행렬 처리를 진행한다. Space transformation : Local > World > View > Projection
- 뼈대 기반 애니메이션(정점 스키닝) 변환 처리
- 정점들 개별적인 조명 계산 수행. (per-vertex lighting)
- 새로운 정점을 생성하거나 기존 정점들은 삭제 불가능하다.
- 정점 정보들을 절단 공간(Clip Space)으로 변환하는 것이 주목적이다.
Rasterizer
Vertex Shader의 출력 정보를 입력 정보로 처리한다. : Clip Space로 이동된 정점 정보들
입력 정점 정보 > 후면 제거 > 뷰포트 변환 > 래스터화 > Fragment 출력
Back-facae Culling
- 카메라를 기준으로 뒷면에 해당하는 면(Face) 제거
- 기본도형 중에서 면(Face)에 해당되는 것은 무엇인가?
- 뒷면에 기준이 되는 것은 삼각형을 구성할 때의 감긴 방향에 의해서 결정된다.
- DirectX는 왼손 좌표계이기 때문에 감긴 방향이 시계방향이다.
Rasterization (래스터화)
- Clip Space의 정보들을 이용해서 지정된 기본도형 형태로 내부 영역을 채우는 Fragment 생성하는 과정
- 생성된 Fragment는 Pixel Shader의 입력정보로 전달된다.
- 최종 화면에 보이는 Pixel들을 선별하기 위한 전처리 과정이다.
Pixel(Fragment) Shader
- Rasterization으로부터 전달된 Fragment 처리
- 최종적으로 화면에 보일 컬러를 계산한다.
- UV값을 이용하여 텍스처로부터 해당 컬러 얻기가 가능하다.
Output Merge (OM) : 다시 들어야 함.
컬러와 깊이/스텐실 버퍼의 내용을 합해서, 마지막 픽셀 생성한다.
표시되는 픽셀에 대해서 깊이 테스트
표시되는 픽셀에 대해서 스텐실 테스트 진행
하나 이상의 픽셀 값을 결합하여 최종 픽셀에 대한 색 처리
최종 픽셀에 대한 처리 후 렌더링 대상에 출력
Shader
3D Scene에서 Shading에 사용 되는 작은 프로그램
Shading (음영)
3D Scene에서 물체/표면/폴리곤의 색상을 변경시키는 과정
- 표면을 기준으로 한 빛에 대한 각도
- 빛과의 거리
- 카메라 각도
- 재질의 속성
Shading
1. Flat Shading
Face내에 같은 Shading 처리, 계단 현상이 일어난다.
2. Gouraud Shading
Face내의 정점 별로 Shading 처리 후 bilinear interpolation처리한 결과.
3. Phong Shading
Normal Vector를 보간 하여 계산, 각 Pixel별로Normal Vector 다시 계산한 결과물.
Unity에서의 Shader Language
2019.4버전 부터 명시적으로 HLSL을 사용한다. (이전에는 Cg를 사용했지만 더 이상 사용하지 않는다.)
- Windows 플랫폼 : HLSL 이용
- OpenGL, OpenGL-ES, Metal : HLSL이용한 후 HLSLcc 사용하여 변환 (GLSL, Metal, SPIR-V)
- Vertex & Fragment Shaders
- Surface Shaders
- Fixed Function shaders : 거의 사용하지 않는다.
'대학생활 > 수업' 카테고리의 다른 글
게임데이터설계 9주차 (0) | 2023.05.06 |
---|---|
게임알고리즘 8주차 - Search Algorithms, Interpolation Search, Tree (0) | 2023.05.06 |
게임레벨디자인 8주차 (0) | 2023.04.28 |
게임음악작곡법 8주차 (0) | 2023.04.27 |
게임알고리즘 7주차 (0) | 2023.04.26 |