1. 렌더링 파이프라인
렌더링 파이프라인이란, 3D 그래픽을 어떻게 그려나가는지에 대한 절차의 설명입니다.
나. 삼각형 분할
각 vertex를 연결해서 삼각형을 그리게 됩니다. 이 때 시계방향으로 그리냐 시계 반대방향으로 그리냐에 따라 앞 뒷면이 정해지게 되고, 혹은 양 면을 다 그릴 수도 있습니다. 이것은 렌더링 기본설정에서 정해지게 됩니다.
다. 정점 쉐이더 (vertex shader)
정점 쉐이더에서는 기본적으로 행렬연산에 의한 변환작업이 주로 이루어집니다.
변환작업이란 다음과 같은 개념이지요. 엄밀하게 말하면 아래 그림과는 조금 다른 개념이지만, 따로 설명하기가 어렵군요.
기본적으로 오브젝트는 자기 자신이 가지고 있는 각각의 좌표계로 되어 있습니다.
일단 그걸 월드 좌표계로 변환해줍니다. (행렬을 곱해서 만듭니다.)
다시 그걸 카메라좌표계로 전환을 합니다.
그걸 카메라에서 바라보면 이런 느낌이 됩니다.
이것을 Orthographic 또는 Isometric 이라 부릅니다.
(원근감이 없는 2D 게임 같은 이미지가 됩니다.)
이것에 다시 투영행열을 계산하여 원근감을 구현해 줍니다.
즉 원근감이 없는 2D 게임같은 이미지는 한 번 더 계산이 줄기 때문에 조금더 빠른 방식이라는 것을 알 수 있습니다.
이상의 4가지 단계가 일반적인 vertex shading의 기본 단계입니다.
이후 이 단계에서 Normal 값과 Light Direction, View Direction 등을 이용하여 빛을 계산 할 수도 있습니다.
2. Clipping
오브젝트 중 화면에 보이지 않는 부분을 잘라서 안 그려버리는 방법입니다.
당연하게도 보이지 않는 것은 그리지 않는 것이 유리합니다.
3. Backface Culling
카메라에서 보이지 않는 방향의 면은 그리지 않습니다. 반대방향은 어차피 그려도 보이지 않으니까요.
이 이외에도 사실 여러 종류의 culling 등이 존재하고 있습니다 .
4. Rasterizing
이것은 본격적으로 모니터라고 하는 2차원의 어느 부분'픽셀'에 찍힐 것인지를 결정하는 것입니다.
3차원 이미지는 필연적으로 2차원의 평면인 '모니터' 에 찍혀져야 하기 때문에 다시 2차원의 점으로 환산하는 작업이 필요하게 됩니다. 이것을 Rasterzation 이라고 합니다.
http://commons.wikimedia.org/wik...n_bw.svg
5. PixelShader
이 단계에서 픽셀쉐이더가 시작됩니다.
이 부분에서 하는 일은 Resterizing이 결정되어 찍힐 픽셀이 결정된 상태에서 쉐이딩 - 빛 계산 - 을 시작하게 되는 것으로, 보다 정밀한 계산이 가능해 집니다.
또한 이 부분에서 텍스쳐 셈플러를 통해 텍스쳐가 입혀지게 됩니다.
6. Alpha Test / Alpha blending
알파 테스트와 알파 블렌딩은 무척 중요한 개념입니다.
여기에서 sorting의 개념이 같이 들어가기 때문이지요.
이전에도 설명했듯이, 텍스쳐에는 알파 채널이 들어갈 수 있습니다.
그 알파 채널은 보통 256 단계로 부드럽게 들어갈 수 있습니다만, 그런 경우 문제가 생길 수 있습니다.
예를 들어 반투명의 유리창이 있고 그 뒤에 공이 있다면, 공은 유리창 뒤에 있음에도 불구하고 '유리창에 반쯤 영향받은 채 보여야'
할 것입니다. 즉 '뒤에 있는데도 보여져야 한다' 라는 명제가 생기게 되는 것이므로, '뒤에 있으면 그리지 않는다' 라는 기본 깊이테스트를 무시해야 하는 것이지요.
그렇지만 알파 테스트를 적용하게 하면, 256단계의 부드러운 알파 채널의 단계 중 일정 부분을 정해서 그 투명도를 0 또는 1로 정의해 버립니다. 즉 '반투명' 이란 것은 없고, 이 픽셀이 보이는가 안보이는가만 임의대로 (예를 들어 100보다 크다던가) 결정해 버리는 것입니다. 이렇게 하면 일반 오브젝트 그리는 것과 별 차이 없이 처리할 수 있는 장점이 있지만 알파 채널의 퀄리티는 다소 떨어지게 됩니다. 하지만 대부분의 게임에서는 이 알파 테스트를 사용하게 됩니다 .(다시 말해서, 이전시간에 설명했던 것과 같이 DDS 데이터를 아무리 RGBA 4:4:4:8 로 한다 하더라도 결국 4:4:4:1과 같이 출력되게 되는 것이므로 쓸 데없이 알파 채널을 8비트로 그릴 필요가 없다는 것입니다)
알파 블렌딩은 이보다 더 복잡하게 됩니다. 위에 설명했던 것 처럼 알파 블렌딩이 들어가게 되면, '모든 픽셀은 언제나 보일 수 있다' 라는 정의가 작동하게 됩니다. 반투명의 유리가 수 십장 겹쳐져 있어도 전부 보이는 것처럼 말입니다.
그렇게 되면 더 이상Z 버퍼에 의한 거리 판별은 무의미하게 되며, 모든 픽셀은 이 픽셀이 보인다는 가정하에 얼마나 보이는가를 계산해야 되는 상황이 됩니다. 불투명한 오브젝트라 하더라도 일단 계산에는 무조건 올라가게 됩니다. 그러면서도 깊이 테스트는 필요해 질 수 밖에 없는 것이, 중간에 불투명한 오브젝트가 끼어 있을지도 모르기 때문입니다. 불투명한 오브젝트라면 그 뒤의 것들은 그려지지 말아야 하니까요. 이렇게 복잡한 계산 때문에, 제대로 sorting 하지 않으면 아래 그림처럼 나타나게 됩니다.
그러므로 알파 블렌딩이 사용되게 되면, 나머지 것들을 다 그리고 난 후 알파 블렌딩이 되는 것들만 모아서 위치값을 재 정렬하고, 다시 그것들을 찍으면서 모든 픽셀의 색상을 계산해 줘야 합니다. (얼마나 반투명 되는지 말이지요)
당연하게도 이것은 엄청난 시간을 들이게 되는 작업이므로, 현재의 게임에서는 되도록 피해야 하는 방법입니다.
이것은 주로 머리카락 등에서 그래픽 디자이너의 요청으로 사용되어지도록 요청될 수 있습니다. 부드러운 머리카락을 Alpha test 따위로 거칠게 만들어 버리고 싶은 그래픽 디자이너는 없으니까요. 그렇지만 그렇게 되면 역시 오른쪽과 같은 sorting 문제가 발생하면서 다시 그래픽 디자이너의 원망을 듣게 될 것입니다.
때문에 기술적으로 이해가 높은 그래픽 디자이너가 있는 프로젝트에서는, 머리카락에 알파 블렌딩을 거의 사용하지 않고 처리해 버리기도 합니다. 직접 몇 덩어리씩 모델링 해버리거나, 알파 테스트를 사용하되 해상도를 높여서 지저분한 흔적을 최대한 줄여버리는 꼼수를 사용할 수도 있는 것입니다.
그렇지만 알파 블렌딩을 아예 사용하지 않을 수는 없습니다. 대표적인 것은 이펙트입니다. 이펙트는 사실상 90% 이상이 알파 블렌딩만으로 처리되며, 높은 수준의 이펙트가 부하를 유발하는 주범이 되는 것은 이 때문입니다.
또한 반투명한 유리나 비치는 옷 같은 경우도 알파 블렌딩을 사용할 수 밖에 없는 부분입니다.
그러므로 효율적인 알파 블렌딩을 사용하기 위해서는 '아예 과감히' 사용하는 것이 가장 좋습니다.
예를 들어 원피스의 옷 한벌에 텍스쳐를 한 장 사용하고, 가슴팍 부분 일부만 반투명으로 하느니 차라리 원피스 전체를 반투명으로 하는 것이 나을 것입니다. (아니면 반투명을 전혀 안쓰도록 디자인하던가 말입니다)
이것은 Anti-aliasing과도 혼동될 수 있습니다만, 이것은 텍스쳐의 alpha 부분의 정밀도를 계산하는 방법이므로 antialiasing과는 근본적으로 차이가 있음을 주의하시기 바랍니다.
7.Z test
어느 오브젝트가 앞에 있는지를 판별하는 것입니다. 기본적으로 Z 버퍼(깊이 버퍼)를 이용하여 멀고 가까운 거리를 판별합니다.
하지만 정밀도가 무한하지 않기 때문에 너무 근접한 오브젝트의 경우에는 오류가 있을 수도 있습니다.
8. 스텐실 테스트
반사 되는 장면을 그릴 때 거울 부분에만 그려지는 것 처럼 일부분에만 그려지도록 마스킹하는 테스트입니다.
9. Fog
일정 깊이값을 대상으로 안개의 색상을 더합니다.
편법으로, 절대 갈 수 없는 원경을 저급한 퀄리티의 폴리곤으로 멀리 만들어 놓고, fog 색의 2*2 의 텍스쳐를 입혀 놓는 편법을 사용하여 게임의 최적화를 하기도 합니다.
'Visualization Programming > Basic Knowledge' 카테고리의 다른 글
Basic Knowledge - Z-Fighting (0) | 2017.04.19 |
---|---|
Basic Knowledge - Pitch , Yaw , and Roll Systems (0) | 2017.04.19 |
Basic Knowledge - FOV (Field of View) (0) | 2017.04.19 |
Basic Knowledge - DOF(Depth of Field) (0) | 2017.04.19 |
Basic Knowledge - 렌더링의 개요 (0) | 2017.04.19 |