1 분 소요

디버깅을 위한 WireFrame 그리기

3D 모델을 렌더링 하기전,
이러한 모델을 WireFrame 방식으로 그리는 방식을 알아보자

  • WireFrame?
    3D 메시를 삼각형으로 그림으로서
    ‘그물망’처럼 표현하는 시각화 방식
    후처리 없이 순수한 ‘기하’형태에 따른 구조만을 표시한다
  • 필요한 이유?
    메시(Geometry)의 최적화 상태의 확인,
    모델링이 삼각형이 얼마나 사용되었는지에 대한 시각적 확인,
    불필요한 폴리곤이 들어갔는지, LOD 등이 잘 작동하는지를 확인
    (그 외에도 Z-Fighting 현상이나 UV 등에 대한 것도 확인할 수 있다)
    (충돌 / Occlusion(가림처리) 문제도 확인해볼 수 있음)

이러한 체킹을 시각적으로 빠르게
할 수 있기에 WireFrame 모드는 여러 엔진이나
그래픽스 툴에서 기본 제공된다

예제 - WireFrame을 버튼을 누름으로서 전환

  • 일반적인 렌더링

Image

  • WireFrame

Image

이러한 버튼체크에 따라서
Mode를 바꿔주는 것이 이번 예제의 목표

Rasterize State 의
D3D11_FILL_MODE::D3D11_FILL_WIREFRAME가 이번 예제의 핵심
(D3D11_CULL_MODE::D3D11_CULL_NONE 도 같이 자주 사용,
투명하게 뒤쪽도 보이게 하기 위하여)

  • RS 단계에서 설정하는 이유?
    Vs 에서 기하의 모양을 정의하고
    이후 래스터라이저에서 이러한 기하 모양을
    ‘픽셀’ 단위로 바꾸는 과정에서 설정한다
    (이후 FillMode로 설정된 Pixel 들만이 Pixel Shader로 간다)
AppBase.h

// TODO: RasterizerState를 2개 만들기
ComPtr<ID3D11RasterizerState> m_solidRasterizerSate; // 일반적인 렌더링용 RSState
ComPtr<ID3D11RasterizerState> m_wireRasterizerSate;  // WireFrame용 RsState
bool m_drawAsWire = false;

---
AppBase - Init()

// Create a rasterizer state
D3D11_RASTERIZER_DESC rastWireDesc;
ZeroMemory(&rastWireDesc, sizeof(D3D11_RASTERIZER_DESC)); // Need this
rastWireDesc.FillMode = D3D11_FILL_MODE::D3D11_FILL_WIREFRAME; // WireFrame Mode
rastWireDesc.CullMode = D3D11_CULL_MODE::D3D11_CULL_NONE;      // 와이어 프레임으로 '투명하게' 뒤쪽까지 보이기 위해 사용
rastWireDesc.FrontCounterClockwise = false;
rastWireDesc.DepthClipEnable = true; // <- zNear, zFar 확인에 필요

m_device->CreateRasterizerState(&rastWireDesc,
                                m_wireRasterizerSate.GetAddressOf());

이후 Render에서 bool 설정에 따라
RsSetState를 바꿔가며 설정하면 된다
(매프레임 호출?
그래픽스 파이프라인에서 Set…() 시리즈는
그렇게 부담되는 연산량은 아니다)

ExampleApp - Render

if (m_drawAsWire)
    m_context->RSSetState(m_wireRasterizerSate.Get());
else
    m_context->RSSetState(m_solidRasterizerSate.Get());

댓글남기기