1. 개요 [Bottom] [Top]
가공할 성능
의 3D 가속기 시대에 왠 소프트웨어 렌더링(Software Rendering)...? 단순히 생각하면 필요 없을지도 모르겠다. 그러나 3D 가속기라고 해도 핵심 칩인 GPU 의 렌더링 알고리즘(Rendering Algorithm) 은 소프트웨어 렌더링과 역시 동일 구조로 되어 있다. 즉, 렌더링 알고리즘을 하드웨어로 옮겨놓은 것일 뿐이지 별 차이가 없다. 그리고 쉐이더(Shader) 를 쓰기 이전의 3D 그래픽 영상들은 고정 파이프라인을 사용하였기 때문에 비슷한 영상을 보여 주었다(하드웨어 특징상 Algorithm 변경이 불가능하기 때문에 하드웨어 가속을 이용하는 모든 게임들이 비슷한 영상을 보여줌). 그래서 정점 쉐이더(Vertex Shader) 나 픽셀 쉐이더(Pixel Shader) 가 등장하게 된 것인지 모른다.
어째든 소프트웨어 렌더링을 공부하는 이유는 3D 가속기의 구조를 이해하고 게임에서 100% 의 가공할 성능을 끌어내는 것이 목적이다.
2. 참고도서 [Bottom] [Top]
3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학
- Eric Lengyel 저, 류광 역, 정보문화사
- OPENGL 을 이용한 컴퓨터 그래픽스 제2판
- EDWARD ANGEL 저, 구자영 역, 영한출판사
Real-Time Rendering 2판 http://www.realtimerendering.com
- Tomas Akenine-Moller.Eric Haines 공저, 신병석.오경수 공역, 정보문화사
- Tricks of the 3D Game Programming Gurus: Advanced 3D Graphics and Rasterization
- Andre Lamothe 저, SAMS
3. 참고링크 [Bottom] [Top]
- 참고 자료
g-Matrix : 3D Engine http://www.g-matrix.pe.kr/feature/3dengine/enginelist.htm
- 3D Engine 을 만드는데 필요한 여러가지 자료를 얻을 수 있는 곳으로 국내에서는 거의 유일한 곳
3D World Simulation http://www.euclideanspace.com
- 거의 수학 공식과 3D 이론들로 가득찬 곳, Java 로 구현되어 있음
The Poly Pipeline; or how to do TLC (Transform,Light & Clip) fast http://www.cbloom.com/3d/techdocs/pipeline.txt
T&L 파이프라인을 설계하고 최적화는데 참고할만한 자료, Text 형태의 영문파일
- 공개 엔진
Coco3D - Generic 3D Software Renderer http://www.codeplex.com/Coco3D
g-Matrix3d http://member.hitel.net/cgi-bin/cgiwrap/~kaswan/zizi.cgi?db=down&cmd=read&pg=1&num=9999992-00
- 3D Rendering Pipeline
OpenGL Pipeline ftp://ftp.sgi.com/opengl/doc/opengl1.1/state.pdf
Direct3D Pipeline http://www.xmission.com/~legalize/book/preview/poster/
4. 3D 렌더링 파이프라인 [Bottom] [Top]
나름대로 공부한 내용을 간략하게 그림으로 그려본 것으로 OpenGL 이나 DirectX 에 비하면 터무니 없이 부족할 수 밖에 없다. 아직 완성된 것은 아니지만 필요한 부분만 나열되어 있으며 앞으로 계속 보완해야 할 부분이 많다.
좀 더 자세한 3D 렌더링 파이프라인에 대한 구조는 위의 참고링크 중 3D Rendering Pipeline 의 링크를 참고하도록 한다. 하지만 너무 복잡해서...
5. 구현 [Bottom] [Top]
5.1. View Transform [Bottom] [Top]
void LookAt( CVector4 & vTarget, CVector4 & vCamera, CVector4 & vUp ) { CVector4 vR, vU, vD; CMatrix4 temp; vUp.Normalize(); vD = vTarget - vCamera; vD.Normalize(); vR = vUp ^ vD; vR.Normalize(); vU = vD ^ vR; temp.Initialize( vR.x, vU.x, vD.x, 0.0f, vR.y, vU.y, vD.y, 0.0f, vR.z, vU.z, vD.z, 0.0f, -( vCamera * vR ), -( vCamera * vU ), -( vCamera * vD ), 1.0f ); m_CTMatrix *= temp; }
5.2. Projection Transform [Bottom] [Top]
void PerspectiveFOV( float fFov, float fAspect, float fNearZ, float fFarZ ) { CMatrix4 temp; float w, h; float d; w = 1.0f / tanf( fFov * 0.5f ); h = 1.0f / ( tanf( fFov * 0.5f ) * fAspect ); d = fFarZ / ( fFarZ - fNearZ ); temp.Initialize( w, 0.0f, 0.0f, 0.0f, 0.0f, h, 0.0f, 0.0f, 0.0f, 0.0f, d, 1.0f, 0.0f, 0.0f, -( d * fNearZ ), 0.0f ); m_CTMatrix *= temp; }
