DOTY

DirectX11. check 1) Back-Face culling 본문

DirectX

DirectX11. check 1) Back-Face culling

증식세포 2023. 6. 14. 16:35
728x90
반응형

공부 하다가 왜 회전하는 삼각형이 앞면에만 표시되고 뒷면은 보여지지 않는걸까 생각을 해봤다. 

vertices[0].position = XMFLOAT3(-1.0f, -1.0f, 0.0f);  // Bottom left.
vertices[0].texture = XMFLOAT2(0.0f, 1.0f);
vertices[0].normal = XMFLOAT3(0.0f, 0.0f, -1.0f);

vertices[1].position = XMFLOAT3(0.0f, 1.0f, 0.0f);  // Top middle.
vertices[1].texture = XMFLOAT2(0.5f, 0.0f);
vertices[1].normal = XMFLOAT3(0.0f, 0.0f, -1.0f);

vertices[2].position = XMFLOAT3(1.0f, -1.0f, 0.0f);  // Bottom right.
vertices[2].texture = XMFLOAT2(1.0f, 1.0f);
vertices[2].normal = XMFLOAT3(0.0f, 0.0f, -1.0f);

vertices[3].position = XMFLOAT3(-1.0f, -1.0f, 0.0f);  // Bottom left.
vertices[3].texture = XMFLOAT2(0.0f, 1.0f);
vertices[3].normal = XMFLOAT3(0.0f, 0.0f, 1.0f);

vertices[4].position = XMFLOAT3(0.0f, 1.0f, 0.0f);  // Top middle.
vertices[4].texture = XMFLOAT2(0.5f, 0.0f);
vertices[4].normal = XMFLOAT3(0.0f, 0.0f, 1.0f);

vertices[5].position = XMFLOAT3(1.0f, -1.0f, 0.0f);  // Bottom right.
vertices[5].texture = XMFLOAT2(1.0f, 1.0f);
vertices[5].normal = XMFLOAT3(0.0f, 0.0f, 1.0f);

위의 예시를 들어서 설명하자면 렌더링이 안되는 경우의 코드는 다음과 같다.

indices[0] = 0;  // Bottom left.
indices[1] = 1;  // Top middle.
indices[2] = 2;  // Bottom right.
indices[3] = 3;  // Bottom left.
indices[4] = 4;  // Top middle.
indices[5] = 5;  // Bottom right.

렌더링이 되는 경우의 코드는 다음과 같다.

indices[0] = 0;  // Bottom left.
indices[1] = 1;  // Top middle.
indices[2] = 2;  // Bottom right.
indices[3] = 5;  // Bottom right.
indices[4] = 4;  // Top middle.
indices[5] = 3;  // Bottom left.

Clockwise(시계방향)

두 코드의 차이는 방향에 차이가 있다.

삼각형을 그릴 때 Vertex 순서시계방향으로 하냐, 반 시계방향으로 하냐의 차이.

 

이를 설명하기 위해서 Back-Face Culling을 알아야한다.

 

Back-Face Culling

3D 객체는 보통 삼각형으로 구성되며, 삼각형은 앞면(Front-face)과 뒷면(Back-face)을 가지고 있다. 렌더링 시에는 앞면이 시야에 보이는 경우에만 그리는 것이 효율적으로 Back-face culling은 이러한 원리를 이용하여 뒷면을 그리지 않고 제외하여 렌더링 성능을 향상시킨다.

 

기본적으로 DirectX에서는 Back-Face Culling을 사용하는 것을 기본으로 앞면을 시계방향으로 정의한다.

하지만 설정을 변경할 수 있다. 

D3D11_RASTERIZER_DESC rasterDesc;

rasterDesc.CullMode = D3D11_CULL_BACK;
rasterDesc.FrontCounterClockwise = false;

CullMode

  • D3D11_CULL_BACK : Back-Face Culling을 사용한다는 뜻으로 D3DRS_CULLMODE 렌더링 모드와 같다.
  • D3DCULL_NONE : Back-Face Culling을 사용하지 않는다.

FrontCounterClockwise

  • false : 시계 방향(Clockwise)를 앞으로 설정한다.
  • true : 반시계 방향을 앞으로 설정한다.
728x90
반응형

'DirectX' 카테고리의 다른 글

DirectX11. 8) Ambient Light, Specular Lighting  (0) 2023.06.19
DirectX11. 7) 3D Model Rendering  (0) 2023.06.16
DirectX11. 6) Light  (0) 2023.06.14
DirectX11. 5) Texture  (0) 2023.06.13
DirectX11. 4) Buffer, Shader II  (0) 2023.06.12
Comments