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
복사