WireFrame 그리기
디버깅을 위한 WireFrame 그리기
3D 모델을 렌더링 하기전,
이러한 모델을 WireFrame 방식으로 그리는 방식을 알아보자
-
- WireFrame?
- 3D 메시를 삼각형으로 그림으로서
‘그물망’처럼 표현하는 시각화 방식
후처리 없이 순수한 ‘기하’형태에 따른 구조만을 표시한다
- WireFrame?
- 필요한 이유?
메시(Geometry)의 최적화 상태의 확인,
모델링이 삼각형이 얼마나 사용되었는지에 대한 시각적 확인,
불필요한 폴리곤이 들어갔는지, LOD 등이 잘 작동하는지를 확인
(그 외에도 Z-Fighting 현상이나 UV 등에 대한 것도 확인할 수 있다)
(충돌 / Occlusion(가림처리) 문제도 확인해볼 수 있음)
이러한 체킹을 시각적으로 빠르게
할 수 있기에 WireFrame 모드는 여러 엔진이나
그래픽스 툴에서 기본 제공된다
예제 - WireFrame을 버튼을 누름으로서 전환
- 일반적인 렌더링
- WireFrame
이러한 버튼체크에 따라서
Mode를 바꿔주는 것이 이번 예제의 목표
Rasterize State 의
D3D11_FILL_MODE::D3D11_FILL_WIREFRAME가 이번 예제의 핵심
(D3D11_CULL_MODE::D3D11_CULL_NONE 도 같이 자주 사용,
투명하게 뒤쪽도 보이게 하기 위하여)
-
- RS 단계에서 설정하는 이유?
- Vs 에서 기하의 모양을 정의하고
이후 래스터라이저에서 이러한 기하 모양을
‘픽셀’ 단위로 바꾸는 과정에서 설정한다
(이후 FillMode로 설정된 Pixel 들만이 Pixel Shader로 간다)
- RS 단계에서 설정하는 이유?
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());
댓글남기기