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

image.png

아래는 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

2. 주요 속성 설명

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);
	}