제임스딘딘의
Tech & Life

개발자의 기록 노트/XNA Framework

XNA와 3D 기초 (1)

제임스-딘딘 2011. 9. 10. 15:41
 [1] XNA에서 3D 프로그래밍의 시작.
3D 자료를 2차원인 모니터 화면에 렌더링 한다는 것의 의미는 무엇인가??

3D 렌더링이라는 것은 기본적으로 3차원 공간의 기하구조를 2차원 평면에 투영하고, 투영된 기하구조에 적절한 색들을 채워 넣는 것이다.

초창기 3D게임들은 3D 렌더링을 위한 레이캐스팅(ray-casting)과 같은 기법들을 전적으로 CPU에서 처리!
하지만, 오늘날의 3D 그래픽 처리는 모두 GPU에서 일어난다.

GPU는 다각형들을 화면에 그리고 픽셀들을 채우는 일뿐만 아니라
3D자료를 2D로 투영하고 변환하는 작업도 모두 처리한다.

게다가 투영, 변환과 픽셀 채우기 작업의 구체적인 방식을 개발자가 세세하게 지정하는것도 가능
 ☞ 셰이더(Shader) 기술을 통해서 가능함

3D 점들을 화면 좌표로 투영하는 작업 : 정점 셰이더(Vertex Shader)
화면에 보이는 다각형들을 픽셀로 채우는 작업 : 픽셀 셰이더(Pixel Shader)

특히 픽셀 셰이더는 색을 바꾸거나, 텍스쳐들을 혼합하거나, 빛과 그림자를 적용하는 등으로 최종적인 결과물의 모습을 임의로 제어할 수 있는 수단이다!

XNA는 정점 셰이더와 픽셀 셰이더를 지원하지 않는 구형 하드웨어를 아예 지원하지 않음.
 ☞ 따라서 하위 호환성을 위해 고정 기능 파이프라인이나 소프트웨어 렌더링으로 전환하는 문제는 전혀 생각할 필요가 없다. (XNA를 위해서는 적어도 셰이더 모델 1.1이 필요. 즉, 지포스3나 ATI 8000급의 그래픽 카드가 필요하다는 뜻)





 [2] 3D 자료가 2차원 화면으로 투영되기까지.
크게 다음과 같은 네 단계를 거친다.

- 3D자료를 WorldMatrix를 통해서 3차원 공간의 적절한 위쳉 적절한 방향, 크기가 되도록 배치.

- 3D 모형의 모든 점(Vertex)이 이 WorldMatrix에 의해 변환되어서 3D 세계 공간의 적절한 위치에 놓임.
DirectX나 고정 기능 파이프라인에서는 이러한 변환이 자동으로 일어나나, XNA에서는 셰이더로 모든 변환을 직접 수행해 주어야 함. (XNA는 고정 기능 파이프라인(FFP)을 전혀 지원하지 않음)

- 화면에 실제로 나타나는 것들은 카메라(또는 시점)의 위치와 방향에 의해 결정됨. 3D 세계 공간의 모든 것이 이 카메라 공간으로 투영됨.
다른말로 하면, 카메라 행렬을 적절히 설정하는것으로 3D 세계 공간의 어떤 부분을 어떤 각도로 표시할 것인가가 결정된다는 얘기. (Matrix.CreateLookAt 메서드로 생성한 카메라 행렬을 정점 셰이더에게 넘겨주면 정점 셰이더가 그것을 통해 3D 세계의 자료를 카메라 공간으로 변환)

- 카메라 공간에 투영된 모든 것을 화면 공간으로 변환. 최종적으로 2차원 화면 버퍼에 렌더링.
카메라 공간에서 화면 공간으로의 변환하는 방식은 투영 행렬(Projection Matrix 라 함)에 의해 결정.
카메라의 시야각, 가까운 평면과의 거리와 먼 평면과의 거리를 지정해서 투영 행렬을 만들어 준다.



 [3] 3D 자료의 최종적인 모습을 만드는 것
화면에 투영된 3D 자료에 픽셀들을 채워 최종적인 모습을 만드는 작업은 픽셀 셰이더가 담당.
화면이 2차원이므로 픽셀 셰이더도 2차원 공간에서 동작함.