Search
Duplicate

Wireframe 모드

Direct3D 11에서 와이어프레임 모드로 렌더링하려면 D3D11_RASTERIZER_DESC 구조체를 설정하고, 이를 통해 ID3D11RasterizerState 객체를 생성하여 와이어프레임 모드를 활성화할 수 있습니다. 이 방법은 메시나 장면을 와이어프레임으로 렌더링할 때 유용합니다.
아래는 D3D11에서 와이어프레임 모드를 설정하는 예제 코드와 설명입니다.

1. D3D11_RASTERIZER_DESC 설정

D3D11_RASTERIZER_DESC 구조체를 사용하여 와이어프레임 모드를 정의합니다. 주요 속성은 FillMode로, 이를 D3D11_FILL_WIREFRAME으로 설정하면 와이어프레임 렌더링이 활성화됩니다.
// wireframe state 옵션 설정 #pragma region rasterize state D3D11_RASTERIZER_DESC rsDesc = {}; rsDesc.AntialiasedLineEnable = false; rsDesc.CullMode = D3D11_CULL_BACK; rsDesc.DepthBias = 0; rsDesc.DepthBiasClamp = 0.0f; rsDesc.DepthClipEnable = true; rsDesc.FillMode = D3D11_FILL_SOLID; rsDesc.FrontCounterClockwise = false; rsDesc.MultisampleEnable = false; rsDesc.ScissorEnable = false; rsDesc.SlopeScaledDepthBias = 0.0f; GetDevice()->CreateRasterizerState( &rsDesc, rasterizerStates[static_cast<UINT>(eRasterizerState::SolidBack)].GetAddressOf()); rsDesc.FillMode = D3D11_FILL_SOLID; rsDesc.CullMode = D3D11_CULL_FRONT; GetDevice()->CreateRasterizerState( &rsDesc, rasterizerStates[static_cast<UINT>(eRasterizerState::SolidFront)].GetAddressOf()); rsDesc.FillMode = D3D11_FILL_SOLID; rsDesc.CullMode = D3D11_CULL_NONE; GetDevice()->CreateRasterizerState( &rsDesc, rasterizerStates[static_cast<UINT>(eRasterizerState::SolidNone)].GetAddressOf()); rsDesc.FillMode = D3D11_FILL_WIREFRAME; rsDesc.CullMode = D3D11_CULL_NONE; GetDevice()->CreateRasterizerState( &rsDesc, rasterizerStates[static_cast<UINT>(eRasterizerState::Wireframe)].GetAddressOf()); #pragma endregion
C++
복사

2. 주요 속성 설명

FillMode: D3D11_FILL_WIREFRAME으로 설정하여 와이어프레임 모드를 활성화합니다. 이 외에도 D3D11_FILL_SOLID를 사용하여 기본 솔리드 렌더링 모드로 돌아갈 수 있습니다.
CullMode: 와이어프레임 렌더링에서는 컬링이 필요 없을 수 있으므로 D3D11_CULL_NONE로 설정할 수 있습니다. 컬링이 필요한 경우 D3D11_CULL_BACK 또는 D3D11_CULL_FRONT로 설정하여 원하는 면을 컬링할 수 있습니다.
FrontCounterClockwise: 앞면을 정의합니다. 기본적으로 시계 방향으로 설정하여 폴리곤이 시계 방향일 때 앞면으로 인식합니다.
DepthClipEnable: TRUE로 설정하여 뎁스 클리핑을 활성화합니다. 이는 Z-축 방향으로 클리핑을 활성화하여 렌더링 범위를 제어합니다.

3. 와이어 프레임 모드 레스터라이제이션 바인딩

// 렌더링파이프라인 와이어프레임 모드 바인딩 void Shader::Bind() { if (bWireframe) { Shader* wireframeShader = Resources::Find<Shader>(L"WireframeShader"); Microsoft::WRL::ComPtr<ID3D11VertexShader> wireframeShaderVS = wireframeShader->GetVS(); Microsoft::WRL::ComPtr<ID3D11PixelShader> wireframeShaderPS = wireframeShader->GetPS(); Microsoft::WRL::ComPtr<ID3D11RasterizerState> wireframeRasterizerState = renderer::rasterizerStates[static_cast<UINT>(eRasterizerState::Wireframe)]; GetDevice()->BindVS(wireframeShaderVS.Get()); GetDevice()->BindPS(wireframeShaderPS.Get()); GetDevice()->BindRasterizerState(wireframeRasterizerState.Get()); GetDevice()->BindBlendState(renderer::blendStates[static_cast<UINT>(mBlendState)].Get(), nullptr, 0xffffff); GetDevice()->BindDepthStencilState(renderer::depthStencilStates[static_cast<UINT>(mDepthStencilState)].Get(), 0); return; } if (mVS) GetDevice()->BindVS(mVS.Get()); if (mPS) GetDevice()->BindPS(mPS.Get()); GetDevice()->BindRasterizerState(renderer::rasterizerStates[static_cast<UINT>(mRasterizerState)].Get()); GetDevice()->BindBlendState(renderer::blendStates[static_cast<UINT>(mBlendState)].Get(), nullptr, 0xffffff); GetDevice()->BindDepthStencilState(renderer::depthStencilStates[static_cast<UINT>(mDepthStencilState)].Get(), 0); }
JavaScript
복사