정점 조립
저번 시간 그래픽스 API 초기화 과정에 이어서 오늘은 렌더링 파이프라인 과정 중
정점 조립과 버텍스 셰이더에 대해 알아보도록 하겠다. 시작하기 전 저번 포스팅을
안 보고 왔다면 아래 사이트로 들어가 보고 시작하길 바란다.
[Shader] 렌더링 파이프라인(1) 그래픽스 API 초기화 과정
렌더링 파이프라인 렌더링 파이프라인은 3D 세계에 대한 기하학적 표현과, 이 세계를 바라보는 관점을 정의하는 가상 카메라를 이용해 2D 이미지를 만들어내는 역할을 담당한다. 쉽게 말해, 오브
plugxp.tistory.com
정점(vertex)
두 변이 만나는 점, 하나의 점이거나, 도형의 꼭짓점 등이 될 수 있다.
정점은 피리미티브의 꼭지점 위치 정보, 노말, 텍스쳐, 컬러 값 등을 담을 수 있다.
프리미티브(primitive)
기본 도형으로, 렌더링 할 수 있는 도형의 최소 단위가 된다.
원시적인, 원초적인 이라는 의미를 가진다.
정점 버퍼(vertex buffer)
렌더링에 사용할 버텍스들을 스트림 형태로
모아놓은 자료구조이다.
기본적인 용어들은 이러하고
정점 조립은 정점 버퍼의 요소들을 정점 구조체로 조립하는 과정이다.
스트림 방식으로 각각의 정점 데이터들이 늘어져 있는 것보단
사용하기 직관적으로 하기 위해 각 정점마다 이를 구조체 형식으로
분리하는 과정이다.
버텍스 셰이더
버텍스 셰이더 내부의 변환 과정이나 기능들을 살펴보기 앞서
결론적으로 버텍스 셰이더를 거치고 나게 되면, 각각의 오브젝트들을
스크린으로 투사되었을 때의 위치로 이동시킨다.
첫 번째 포스팅에서도 말했듯이 여러 과정을 나열한 것을 기억하는가?
그 과정들 중 몇 가지는 오늘 소개할 버텍스 셰이더의 과정이 몇가지 존재한다.
버텍스 셰이더는 정점 위치를 옮기기 위해 변환 행렬을 사용하게 되는데
이 변환 행렬은 내부적으로 3개의 행렬 연산으로 이루어져 있다.
1. 모델 행렬
2. 뷰 행렬
3. 투영 행렬
이러한 행렬 연산을 거치면서 다양한 공간을 지나게 되는데 이를
각각 모델 공간, 월드 공간, 카메라 공간, 클립 공간이라고 한다.
위 사진의 왼쪽부터 모델 공간(object space)에서 모델 변환(world transform)을 거쳐
월드 공간(world space)으로 바뀐것을 확인 할 수 있고
월드 공간(world space)에서는 뷰 변환(view transform)을 거쳐 카메라 공간(eye space)
로 바뀌며, 카메라 공간(eye space)에는 투영 변환(projection transform)을 거쳐
클립 공간(clip space)로 최종적으로 변환하였다.
일단 과정은 이러하고
각각의 과정들을 좀 더 살펴보자면
모델 변환
모델 변환을 거치기 전의 정점들,
즉 모델 공간의 특징들을 나열하자면
- 스스로가 세상의 중심
- 3D 모델의 피벗이 원점
왼쪽 사진이 모델 변환을 거치기 전의 사진이고
오른쪽은 모델 변환을 거친 수의 사진이다,
빨간색 점이 수많은 정점 중 하나를 예시로 든 것이다,
이처럼 왼쪽 사진의 정점은 오브젝트 모델의 피벗을 원점으로
(0, 2, 3)으로 떨어져 모든 것을 자신의 중심으로 판별하는가 하면
변환을 거친 뒤로는 월드 세상을 중심으로 위치를 판별한다.
이것이 모델 변환을 하고 안하고의 가장 큰 차이점이다.
뷰 변환
뷰 행렬 변환을 거치게 되면
월드 상의 정점들이 카메라의 상대적인 위치로 이동하게 된다.
즉 카메라의 위치와 방향이 세상의 중심이 되는 것이다.
왼쪽은 뷰 변환을 거치기 전의 사진이고
오른쪽은 뷰 변환을 거친 후의 사진인데
각각의 오브젝트들은 뷰 변환을 거치게 되면
변환 전의 카메라의 거리와 방향의 반대 방향으로
밀려나게 된다, 왜냐하면 카메라가 (0, 0, 0)
세상의 중심이 되어야 하기 때문이다.
투영 변환
마지막으로 투영 변환을 통해서
카메라 좌표계의 정점들을 클립 공간으로 이동시키고
깊이와 원근감을 표현할 수 있게 된다.
현제 투영 변환을 거치기 전의 공간은
카메라 공간이다.
카메라 공간에서는 단순히 카메라 위치를 원점으로 삼는
공간이라, 시야와 원근감이 존재할 수 없지만
투영 변환을 거치게 된다면 클립 공간으로 변경되어
시야와 원근감이 존재하게 된다.
클립 공간은 카메라가 보는 영역(뷰포트)을
직육면체로 압축한 공간인데
범위는 2X2X1으로
X, Y : -1 ~ 1
Z : 0 ~ 1
크기로 구성되어 있다.
그리고 나선 NDC(normalized device coordinates)
으로 변환되는 과정을 또 거치게 되는데
이 과정에서 클립 공간 외부에 있는 정점들은
모두 잘려나가게 된다, 시야 외부에 있는
정점들을 렌더링 해봤자 성능만 낭비되니
이렇게 클립핑 과정을 통해 성능 최적화를 한 것이다.
이렇게 버텍스 셰이더의 모든 과정을 살펴보았고, 다음에는 마저 하지 못했던
레스터 라이저와 프래그먼트 셰이더를 알아보고 렌더링 파이프라인을 마무리
하는 시간을 가져보도록 하겠다.
레퍼런스 사이트
https://docs.tizen.org/application/native/guides/graphics/vertex-shader/
Vertex Shader | Tizen Docs
Application Native Application Guides Graphics OpenGL® ES Vertex Shader Vertex Shader The GPU rendering pipeline is split into programmable stages (vertex and fragment shaders) and hard-wired stages (“primitive assembler & rasterizer” and “output me
docs.tizen.org
'필수 지식 > 셰이더' 카테고리의 다른 글
[Shader] 렌더링 파이프라인(3) 래스터라이저와 프래그먼트 셰이더 (0) | 2022.01.23 |
---|---|
[Shader] 렌더링 파이프라인(1) 그래픽스 API 초기화 과정 (0) | 2022.01.16 |