제 2장 렌더링 파이프라인
제 3장 Direct3D에서의 드로잉
-1조-
렌더링 파이프라인의 아홉 단계
버텍스 정보에서 드로잉까지의 과정
렌더링 파이프 라인
후면 추려내기
투영
(9단계 과정)
(Backface Culling)
(Projection)
버퍼 메모리에
접근
버텍스 정보를 버퍼에
담기
버텍스/인덱스
버퍼 생성
렌더링 파이프라인이란?
후면 추려내기
n 차원에서 n-1 차원을 얻는 과정 ( 3D -> 2D)
기하학적으로 3D 장면을 구성하고 가상 카메라를 설정한 뒤에는 모니터에 2D 표현을 만들어내는 과정
버텍스
인덱스
/
- 후면 폴리곤을 추려냄(이후 프로세스에서 제거)
- 전면 -> 시계 방향 두르기 순서(뷰 스페이스에서)
- 평행 투영
- 원근 투영
--> 카메라에서 멀리 떨어진 물체는 가까운 물체에 비해 작게 표현
버퍼메모리
접근하기
Unlock
Lock
과
버퍼에 값을 직접 넣지 않고, 버퍼를 열어놓고(Lock) 값을 입력 후 버퍼를 닫는(Unlock) 방식
Lock
(버퍼 오픈)
// 잠금을 시작할 버퍼 위치
// 잠글 바이트 수
// 잠근 메모리의 시작 포인터
// 잠금하는 방법
{
UINT OffsetToLock,
UINT SizeToLock,
BYTE** ppdData,
DWORD Flags
};
우리의 시야 볼륨(절두체)을 정의하고, 절두체 내의 기하물체를 투영 윈도우에 투영하는 과정을 담당
- 후면 추려내기를 완전히 끈다.
- 시계 방향 두르기를 가진 삼각형을 추려 냄.
- 시계 반대방향을 추려 낸다. 디폴트 상태.
Device->Transform(D3DTS_WORLD, &worldMatrix);
이 변환에는 행렬이 이용
IDirect3DDevice->SetTransform
정사각형에서 직사각형으로의 매핑에 의해
발생하는 왜곡을 보정하는 역할
Unlock
(버퍼 닫음)
버퍼 생성
버텍스
인덱스
/
CreateVertexBuffer
// 버퍼에 할당할 바이트 수
// 버퍼가 이용되는 방법
// 버텍스 포멧
// 버퍼가 위치할 메모리 풀
// 만들어질 버텍스 버퍼를 받을 포인터
// 이용되지 않는 것. 0으로 지정
{
UNIT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool,
IDirect3DvertexBuffer9** ppVertexBuffer,
HANDLE* pSharedHandel
}
CreateIndexBuffer
// 버퍼에 할당할 바이트 수
// 버퍼가 이용되는 방법
// 인덱스의 크기를 지정
// 버퍼가 위치할 메모리 풀
// 만들어질 버텍스 버퍼를 받을 포인터
// 이용되지 않는 것. 0으로 지정
{
UNIT Length,
DWORD Usage,
DWORD Format,
D3DPOOL Pool,
IDirect3DvertexBuffer9** ppIndexBuffer,
HANDLE* pSharedHandel
}
로컬 스페이스
월드 스페이스
조명
뷰 포트
(Local Space, World Space)
(Lighting)
(View Port)
로컬스페이스 (로컬 좌표 시스템 )
조명
뷰표트 변환
샘플 코드로 보는 Direct3D 드로잉
투영 윈도우에서 화면의 직사각형 (뷰포트)로 변환
- 광원은 월드 스페이스 내에 정의 되지만 뷰 스페이스 변환에 의해 뷰 스페이스로 변환됨
- 광원은 물체에 명암을 추가하여 장면에 사실감을 더해준다.
- '모델링 스페이스' 라고도 불림
- 물체 자체의 좌표 시스템
- 모델링 작업을 쉽고 단순하게 만듬
- 자체의 좌표 시스템을 이용해 정의됨
월드 스페이스(전역 좌표 시스템)
- 다수의 모델을 전역(월드)좌표 시스템으로
옮겨와 하나의 장면을 구성
- 이동, 회전, 크기 변형 등을 포함하는
"월드 변환"이라는 작업을 거침
- 월드 변환은 위치와 크기, 방위를 포함한 각 물체 간의
관계를 정의함.
버퍼를 이용하여
그릴 준비
1. 버텍스 / 인덱스
버퍼 생성
버텍스/인덱스
버퍼를 이용한
드로잉
2. 메모리 접근,
버텍스 정보 담기
드로잉
인덱스/버텍스
드로잉
인덱스/버텍스
드로잉
버퍼를 이용한 그리기
드로잉
인덱스/버텍스
드로잉 시작 :
버텍스 버퍼로 그리는 방법 :
버퍼를 이용하여 그릴 준비
BeginScene();
DrawPrimitive
1. 스트림 소스 지정
SetStreamSource
드로잉 종료 :
인덱스 버퍼로 그리는 방법 :
EndScene();
DrawIndexedPrimitive
{
UINT StreamNumber,
IDirect3DVertexBuffer9* pStreamData,
UINT OffsetInByte,
UINT Stride
};
// 연결할 스트림 소스
// 연결하고자하는 버퍼 포인터
// 파이프라인에 공급될 스트림 시작 포인터
// 스트림에 연결하고자 하는 버퍼 바이트 수
레스터라이즈
클리핑
3. 스트림 소스와 버퍼 연결
2. 버텍스 포맷 지정
뷰 스페이스
SetFVF
{ D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_FEX1}
3. 인덱스 버퍼 지정
4. 드로잉 실시
(rasterize)
(Clipping)
(View Space)
클리핑
래스터라이즈
뷰 스페이스 (뷰잉 변환)
각각의 삼각형을 그리는 데 필요한 픽셀 컬러들을 계산하는 과정
- 시야 볼륨 외부의 기하물체를 추려냄
- 시야 절두체에서의 삼각형 위치는 세 가지로 분류
작업을 수월하게 하기 위해서카메라의 위치를 원점, 보는 방향을 양의 z축으로 변환
1. 완전한 내부
- 그대로 보전되어 다음 단계로 진행
2. 완전한 외부
- 완전히 다 추려냄
3. 부분적 내부(부분적 외부)
- 절두체 내부의 부분만 보존, 외부는 추려냄
- 래스터라이즈 과정은 엄청난 작업 양을 필요로 하므로 반드시 전용 그래픽 하드웨어에서 처리 되어야 한다.
- 결과물은 모니터에 바로 디스플레이할 수 있는 2D 이미지가 된다.
1. 월드 스페이스 내의 물체와 카메라
2. 관찰점을 원점으로 변환, 물체들도 함께 회전
3. z-축에 맞도록 관찰점을 회전 물체들도 함께 회전