1. 기초지식
① 좌표계
-> DX에서는 왼손좌표계 (화면기준으로 x가로 / y세로 / z전후 )
-> Z+ 족이 모니터의 안쪽이다.
-> 3D MAX등등에서는 오른손방식이라서 DX에서 사용시, 좌표및 회전각등을 고려해야 한다.
② 점의 표현
2차원 : ( x, y )
3차원 : ( x, y, z )
③ 폴리곤
-> 모든 도형을 '삼각형'으로 처리한다.
이는 연산및 고속처리드에서 '삼각형'이 이상적. 또한 물체를 표현하는데 하이폴리곤(9만개 이상?)일수록 정교하게 표현가능.
④ 버텍스, 라인
-> 버텍스(vertex, 정점)이 2개면, 법선(edge, 라인).
-> 버텍스 : DWORD로 색깔표현가능. 16진수 사용.
RGB조합[0xargb]으로 각 원소는 0~255[256]. (예. 0xffff0000 == 빨강색)
-> 버텍스 리스트 : 정점들의 위치자체.
예. vertexlist[4] = {v0, v1, v2, v3}
-> 인덱스 리스트 : 정점을 이어서 생성되는 폴리곤들 자체를 표기.
예. indexlist[6] = { (0, 1, 2), (0, 2, 3)}
2. Rendering Pipeline (모르면 개고생일만큼 중요)
① 가장 범용적인 파이프라인 형태
② DX에서의 파이프라인
-> '응용단계'는 DX가 처리하지 않고, '기하 단계'와 '레스터 단계'만 처리
-> 응용프로그래밍에서는 변환/조명/텍스쳐 맵핑
3. 기하 변환
① 절차
② 변환
-> 1단계, 월드변환
예 : 책상 오브젝트를 배치시, 모델링된것을 복사해서 변환 매트릭스값을 거쳐 붙여넣는다.
-> 2단계, 뷰 변환(시야 변환)
-> 3단계, 투영변환
일정한 근거리~일정한 원거리내의 오브젝트등만 화면에 출력.
③ Back Face Culling (후면 선별)
-> 후면의 판별은 View Vector와 폴리곤의 면 법선 벡터 간의 내적 연산을 통해 결정
4. 레스터 변환
① 가시성
3D 공간의 모습을 2D 표면으로 투영할 때 각 픽셀에 겹쳐진 물체간의 깊이 관계를 처리할 필요가 있다.
이 처리에서 가장 효율적인 방법이 픽셀이 그려질 때 깊이 값을 가지는 별도에 메모리를 통해 테스트 과정을 거치는 것이다.
이러한 메모리 버퍼를 Depth Buffer라고 부른다
-> 화면의 시야내에서 겹쳐보이는것들을 처리(가시성으로 해결 가능)
② Depth buffer의 종류
Z-Buffer : Z 값(0.0~1.0)을 이용하는 깊이 버퍼
-> 다만, 책상위의 종이를 그려낼때, 미묘한 착오로 책상이 종이 뚥기도 한다.
-> DX 프로그래밍에서
D3D->SetRenderState(D3DRS_ZENABLE, Value);
부분을 이용해서 활성화 필요.
| W-Buffer : W 값을 이용하는 깊이 버퍼
->Z-Buffer보단 정밀해도 지원되는 VGA가 적음
|
③ Fogging
-> 일정한 원거리를 넘는 영역은 흐릿하게 처리
5. DX의 3D관련 메모리
* Shader에서 사용되는 메모리는 레지스터로 불림
① 화면 해상도 만큼 필요한 버퍼 메모리
Front Buffer(or Back Buffer)
Z-Buffer // 생략 가능
Stencil Buffer // 생략 가능
② 프로그래밍 형식에 따라 가변되는 메모리(Resource라고 부름)
Surface Data
Vertex Buffer, Index Buffer
Texture Buffer
③ 반드시 Graphic Card에 존재해야 하는 메모리
Front Buffer(or Back Buffer)
Z-Buffer
Stencil Buffer
④ 필요시 System Memory에서 복사되어 사용되는 메모리
Surface Data
Vertex Buffer, Index Buffer
Texture Buffer
예시, 1024*768해상도에 사용되는 메모리량의 최소값은?
-> 1024*768 = 786KB
(32비트 버스 = 4byte ) 786K * 4 = 3MB
(SWAP chain등 2개이상의 버퍼) 2 * 3MB + 3MB = 9M