출처 : http://developerscode.blogspot.com/2007/12/d3drscullmode.html

D3DRS_CULLMODE

IDirect3DDevice9::SetRenderState() 안에는 무수히 많은 설정값들이 존재하는데
폴리곤의 뒷면을 제거하는 D3DRS_CULLMODE 옵션에 대해서 설명하려 한다.

사용 형태는 대강 이런 모양이다.

pd3dDevice ->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

DirectX SDK에 D3DRS_CULLMODE 옵션에 대한 설명이 굉장히 모호하게 되어있다.
typedef enum D3DCULL
{
D3DCULL_NONE = 1,
D3DCULL_CW = 2,
D3DCULL_CCW = 3,
D3DCULL_FORCE_DWORD = 0x7fffffff,
} D3DCULL, *LPD3DCULL;

D3DCULL_NONE
Do not cull back faces.
D3DCULL_CW
Cull back faces with clockwise vertices.
D3DCULL_CCW
Cull back faces with counterclockwise vertices.
D3DCULL_FORCE_DWORD
Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

대체 무엇을 뒷면으로 제거한다는 소리인지 헛갈린다. @.@

주지하다시피 DirectX는 왼손 좌표계를 기준으로 삼고 있다. 물론 변경이 가능하지만 "기본"이 그렇다. 따라서 특별히 변경하지 않는다면 모든 공간의 기준은 왼손 좌표계로 꾸려진다.
원래 인간은 오른손 좌표계가 익숙하며 자연스러운데 MS는 OpenGL과 어떻게든 차별성을 두고 싶었나 보다.

뭐 각설하고 간단히 예를 들어 설명하자면
pd3dDevice ->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); 로 설정을 했다면, 뒷면을 시계반대방향으로 정점을 회전시킨 면을 뒷면을 인식한다는 소리다.(CCW : Counter Clock Wise) 즉, 오른손을 말아 쥐었을때 정점이 형성하는 면은 뒷면으로 Culling 한다.

반대로 D3DCULL_CW는 시계방향으로 정점을 엮었을때 형성되는 면을 뒷면으로 인식한다. 즉, 왼손을 말아 쥐었을 때 정점이 형성하는 면을 뒷으로 인식하며 Culling 한다

D3DCULL_NONE는 어느 방향이든 Culling 하지 않고 모두 그려진다.

마지막으로 알아 둘것은 특별히 설정을 하지 않는다면 앞서 이야기했듯이 DirectX는 왼손 좌표계를 따르므로 D3DRS_CULLMODE의 옵션으로 D3DCULL_CCW가 설정된다.
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. 초보자 2012.12.05 22:57 신고  Addr  Edit/Del  Reply

    좋은 글 감사합니다. 이해하기 쉽네요.