그래픽스 파이프라인의 각 과정의 설명 간단하게 적으려고 한다.
코드나 추가내용이 필요한 부분은 따로 파트별로 글을 작성하려고 한다.
이 글에는 코드의 내용은 없으면 역할 정도만 간단한 설명을 하고있다.
Graphics Pipeline(그래픽스 파이프라인)
3차원 이미지를 2차원 래스터 이미지로 표현을 하기 위한 단계적 방법
그래픽스 렌더링 파이프라인, 렌더링 파이프 라인 이라고도 불리며
코딩을 하는순서가 아님!!, 컴퓨터 내에서 그래픽을 생성하는 진행도를 나타냄
주황색 박스 : 조작가능(Programmable)한 단계를 나타낸다.
파이프라인 옆에 있는 그림처럼 각 진행도처럼 적용된다.
Raster(래스터) :
컴퓨터에서 어떠한 도형(또는 이미지)를 2차원 배열 형태의 픽셀로 구성하여 이 점들의 모습을 조합,
일정한 간격의 픽셀들로 하나의 Scene(장면)을 표현하는 것
//그래픽스 파이프라인 참고사이트
https://learn.microsoft.com/ko-kr/windows/uwp/graphics-concepts/graphics-pipeline https://m.blog.naver.com/jyh0841/220473615493
Input Assembler(IA, 입력 조립기)
vertex버퍼의 정점(vertex) 데이터를 이용하여 파이프라인에서 사용할 primitive(프리미티브)로 조립
vertex버퍼의 data는 좌표,uv좌표,색상등 여러가지 data값이 있다.
p.s primitive(프리미티브) : 이용 가능한 가장 단순한(작은) 처리 단위
Vertex Shader(VS, 정점 셰이더)
조립된 primitive를 이용하여 모든 vertex에 대한 연산 처리
-Shape Transform(공간변환) 작업 수행
-많은 비용이 드는 작업이기 때문에 GPU에서 처리
Shape Transform(공간변환) 과정
World Transform(월드 변환) : Local / Model Space(로컬/모델 공간)에서 World Space(월드 공간)으로 변환
3D월드(필드)로 Mesh를 옮기는 과정 , 행렬(Matrix) 변환이 필수
행렬을 이용하여 Translate(이동),Rotate(회전),Scalling(크기) 변환을 수행
World Matrix(월드 행렬) = Scale Matrix(크기 행렬) * Rotation Matrix(회전 행렬) * Translation Matrix(이동 행렬)
Local/Model Space : 3D 오브젝트 모델을 처음 생성할 때에 모델을 가장 편리한 방법으로 배치
편리한 방법 = 오브젝트(도형) 자신의 기준점을 원점
ex) 구를 만들 땐 구의 중심의 좌표를 (0,0,0)으로 설정하고, 반지름을 간단하게(반지름 =1) 설정
World Space : 각각의 오브젝트(도형)들이 월드의 원점을 기준으로 하고
오브젝트의 상대적 위치를 표현하기 위한 좌표계(공간) 이다.
-월드 좌표계에는 한 개의 원점이 존재한다.
-월드 좌표계는 한 개 이상 존재할 수 있으며 , 월드 좌표계가 다르면 오브젝트끼리 서로 침범 할 수 없다.
월드 변환이 필요한 이유 : 각각의 오브젝트를 월드변환을 거치지 않고 World Space에 배치하면 오브젝트끼리 겹치하는 현상이 발생
따로 글 작성 예정 / 필요내용 : 게임수학 - 행렬 계산 방법 , 변환 행렬 들 작성
(링크 달 공간)
Tesslator(테셀레이터)
폴리곤 안에 vertex를 추가하여 굴곡(곡면)을 주는 작업
-안티앨리어싱과 유사함(똑같은건 아님)
-이 과정은 생략이 가능
View Transform(뷰 변환)
월드 상의 오브젝트들을 쉽게 관찰하기 위한 작업
World Space(월드 공간)의 오브젝트들을 view / camera space (카메라 공간)으로 변환 하는 작업
따로 글 작성 예정 / 필요내용 : 카메라 오브젝트(객체) 만드는 코드 등
(링크 달 공간)
Projection Transform(투영)
3차원(n차원) 2차원(n-1차원)으로 변환
그림처럼 3D의 빨간 구와 노란 구는 near clip plane으로 투영되서 2D 이미지가 되었다.
위의 구성은 먼 거리(빨간 구)는 크게 , 가까운 거리(노란 구)는 작게 구성을 한다.
단 Near와 Far Clip의 비율은 같아야한다.
원근감을 살릴려면 빨간구를 작게 노란 구가 커야된다고 생각하지만
가까운 쪽을 늘리면서 원근감을 만들것이기 떄문에 상관이 없어진다.
녹색 구는 Clipped 지역에 있으므로 녹색 구는 Clip Space 밖에 있어 투영되지 않는다.
-Clip Space(클립 공간)은 Frusturm(절두체)이 정의 ( Clip Space = Frusturm )
-Clip Space는 NDC(Normalize Device Coordinate)라고도 불리며, 이 공간은 투영(Proection) 행렬에 정의
따로 글 작성 예정 / 필요내용 : 투영 행렬 작성
(링크 달 공간)
p.s NDC(Normalize Device Coordinate) = 정규 좌표
: 정규 좌표(NDC)는 1을 기준으로 하는 2차원 좌표, 좌표계의 원점은 화면의 점 중앙( 0,0)
이 공간안에 있는 것들은 투영하고 밖에 있는것은 제외하게 된다
정규 좌표를 사용하면 해상도에 따른 화면좌표 계산이 단순화 됨, 해상도를 제외한 값을 계산해 두면 해상도가 변할 경우 쉽게 실제 화면 계산이 가능해진다.즉, 화면 해상도 차이에 빠르게 적응하기 위한 하나의 도구입니다.
Geometry Shader(GS, 기하 도형 셰이더)
처리된 vertex 데이터에 입력 받은 정보를 이용하여 파티클,털,모션블러 등등의 기하처리를 한다.
PS(Pixel Shader)에서 사용할 보간 작업을 수행
p.s 보간
: 새로운 점을 만들기 위해 수많은 점들을 평균화시키는 것, 즉, 두 점을 연결하는 방법을 의미한다.
여기서 말한 연결은 궤적을 생성한다는 뜻이다.
예를 들어 컴퓨터에서 선을 그릴때 ,선은 무수히 많은 점들을 그려 선을 만드는 것이다.
하지만 이 점들을 전부 메모리로 가지고 있으면 메모리 낭비가 심하기 때문이다.
그렇기 때문에 보간작업시 두 점(vertex)을 이용하여 선의 색을 보간에 맞춰 작업 하고 그린다.
포물선 같은경우는 3개의 점이 필요로 하다.
보간에 관련하여 참고한 사이트
https://m.blog.naver.com/ojh6t3k/20196349385
Rasterizer(RS,레스터라이저)
PS(pixel shader)를 작업하기 위해 준비를 갖추는 과정
-하드웨어 자체 알고리즘을 통해 동작
-Pixel Shader의 호출 방법을 결정
-Pixel Shader 단계를 위한 기본 요소를 준비
Rasterize(레스터라이즈) 과정
: 레스터라이즈 진행시에 작업되는 내용들을 정리했다.
Light(조명
조명을 비추어 빛이 물체에 닿았을 때 물체의 표면으로부터 반사되는 색상
빛이 월드 공간에 적용됐을 때 물체가 반사하려는 색상을 결정
빛을 적용시키려면 빛의 반사 벡터를 알아야되는데 , 이 내용은 나중에 게임수학을 다루면서 적도록 하겠다.
(링크 적용)
1. 빛의 요소 :
1-1.Spcular Light(정반사광) : 한 방향으로만 반사되는 빛 , 입사각과 반사각이 똑같은 특징을 갖고있음
1-2.Diffues Light(난반사광) : 물체의 표면에 반사되어 여러 각도로 반사되는 빛
1-3.Ambient Light(환경광) : 다른 표면에 반사되어 전반적인 장면을 밝게하는 빛
2.광원
2-1. Direction Light(방향성 광원) : 위치는 가지지 않음, 지정된 방향으로 평행하게 빛을 발산 . ex)태양
2-2. Point Light(점 광원) : World Space내에 위치를 가지며 모든 방향으로 빛을 발산 ex)성냥불,전구
2-3. SpotLight(스팟 광원) : 광원은 위치를 가지며 특정한 방향으로 원뿔형태의 빛을 발산 ex)손전등
이 요소들을 구조체로 보면 아래와 같은 코드로 적용이 된다.
//Material 구조체에 포함되어있는 빛의요소 data
struct Material
{
XMFLOAT4 ambient;
XMFLOAT4 diffuse;
XMFLOAT4 specular;
float specularPower;
};
//Light 구조체 , Material을 멤버변수로 가지고 있다.
struct Light
{
XMFLOAT4 camPosition; // 카메라의 위치(빛 위치)
XMFLOAT4 light_color; // 빛의 색
XMFLOAT4 light_direction; // 빛의 방향
XMFLOAT4 globalAmbient; //월드 환경광 -> material과 합쳐져서 유저한테 보여진다.
Material material;
}
Material 안에 Light(빛의 요소)들이 적용되어 색상을 반사하게 되는것이다.
코드 중의 specularPower는 정반사광의 날카로운 정도를 지정하는 변수이다.(값이 높을수록 하이라이트를 강조)
Back-face Culling(후면 컬링)
레스터라이저에서 세팅한 전면 그리기 방식 방향을 이용하여 보이지 않는 뒷면을 렌더링 및 연산에서 제외
Cliping(클리핑)
Clip Space(클립 공간)에서 벗어난 요소를 렌더에서 제외(렌더링에서 제외 될뿐 연산은 유지)
Frustum Culling(절두체 컬링)
-완전한 내부 : 폴리곤이 완전히 절두체 내부에 위치하면 보존
-완전한 외부 : 폴리곤이 완전히 절두체 외부에 위치하면 제외
-부분적 내부 : 폴리곤이 부준적으로 절두채 내부에 위치하면 두 부분으로 나누어 내부에 위치한 부분은 보존하고 나머지는 제외
이 절두체 컬링은 cliping과 비슷해보이지만 다른 개념이다.
Cliping은 렌더링 되는 객체들을 화면에 표시하기 전에 잘라내는 과정을 말하는것이고
Frustum Cilling은 카메라의 시야(Frustum)에 포함되지 않는 객체를 제거하는 과정이다.
하지만 두 공통점은 렌더링에서는 제외지만 연산은 적용이 된다는 점이다.
Culling 과 Cliping의 차이
|
컬링
|
클리핑
|
의미
|
보이지 않는 폴리곤은 렌더링 및 연산에서 제외
|
보이지 않는 폴리곤은 렌더링에서 제외
|
연산
|
제외
|
실행
|
정확도
|
낮다
|
높다
|
속도
|
빠르다
|
느리다
|
ViewPort(뷰포트)
ClipSpace(투영공간)의 좌표를 스크린(우리가 보는 화면) 좌표로 변환
-투영된 정보를 Screen에 출력할 수 있는 크기로 변환
-클라이언트 Clip Space를 출력할 영역을 설정
Pixel/Fragment Shader (PS, 픽셀 셰이더)
각 픽셀의 데이터를 생성
-입력 값(Textuer)을 결합하여 색상을 결정
-기본 요소에 대한 보간된 데이터를 받아 색상과 같은 픽셀 데이터를 생성(Resterizer 단계에서 가져온 data)
-조명 및 픽셀에 대한 후 처리 가능
-CPU는 Pixel 각각 한개의 전부 접근해서 작업하지만 GPU는 병렬작업이 가능하기때문에 PS는 GPU로 사용됨
Output Merger(OM ,병합 출력기)
다양한 유형의 출력 데이터(Pixel Shader값 ,Z/Stencil buffer 정보)를 렌더링 대상 및 Z-buffer,Stencil_buffer의 내용과 결합하여 최종 파이프라인 결과를 생성한다.
'컴퓨터 그래픽스' 카테고리의 다른 글
[DirectX11] 절두체 컬링(Frustum Culing) (0) | 2023.06.21 |
---|---|
[DirectX11] D3D - Sprite2D ( 투영(Projection) 간단한 내용) (0) | 2023.06.17 |
[DirectX11] 계층구조(Hierarchy) - D3D 태양계 만들기 (0) | 2023.06.13 |
기본용어 정리 (0) | 2023.06.03 |