레스터라이저 단계에서 픽셀을 그릴 때 그 형식을 바꿀 수 있다. 우리가 아는 보통의 그리기는 SOLID 이다. 근데 선만 삼각형 안의 픽셀들의 보정되어진 색깔 값을 넣지 않고 가장자리 부분 선만 그리는 방식을 택할 수도 있다. 그리고 그 형식이 WIREFRAME 이다.
레스터라이저를 생성하기 위한 DESC 를 만들 때 FillMode 만 변경하여 쉽게 와이어 프레임을 만들 수 있다.
아래 코드를 보면 FillMode 만을 바꿔서 SOLID, WIREFRAME 모드 2가지에 형태의 레스터라이저 스테이트를 생성했다.
이제 Render 함수가 호출 될 때 둘 줄 어떤 레스터 라이저 스테이트를 사용하냐에 따라 그림 형태가 달라질것
// Create a rasterizer state
D3D11_RASTERIZER_DESC rastDesc;
ZeroMemory(&rastDesc, sizeof(D3D11_RASTERIZER_DESC)); // Need this
rastDesc.FillMode = D3D11_FILL_MODE::D3D11_FILL_SOLID;
// rastDesc.FillMode = D3D11_FILL_MODE::D3D11_FILL_WIREFRAME;
rastDesc.CullMode = D3D11_CULL_MODE::D3D11_CULL_NONE;
rastDesc.FrontCounterClockwise = false;
rastDesc.DepthClipEnable = true; // <- zNear, zFar 확인에 필요
m_device->CreateRasterizerState(&rastDesc,
m_solidRasterizerSate.GetAddressOf());
rastDesc.FillMode = D3D11_FILL_MODE::D3D11_FILL_WIREFRAME;
m_device->CreateRasterizerState(&rastDesc,
m_wireRasterizerSate.GetAddressOf());
Render() 중에서.... 아래와 같이 셋팅을 동적으로 선택 할 수 있도록 바꾸어주면 (ImGUI 를 사용 중)
ID3D11ShaderResourceView *pixelResources[2] = {
m_textureResourceView.Get(), m_textureResourceView2.Get()};
m_context->PSSetShaderResources(0, 2, pixelResources);
m_context->PSSetSamplers(0, 1, m_samplerState.GetAddressOf());
m_context->PSSetConstantBuffers(0, 1,
m_pixelShaderConstantBuffer.GetAddressOf());
m_context->PSSetShader(m_colorPixelShader.Get(), 0, 0);
if (m_drawAsWire) {
m_context->RSSetState(m_wireRasterizerSate.Get());
} else {
m_context->RSSetState(m_solidRasterizerSate.Get());
}
와이어 프레임 나타내기.


그리고 이 와이어프레임도 컬링이 가능한대 가령 아래처럼 DESC 로 후면을 컬링시키겠다고 한다면
rastDesc.CullMode = D3D11_CULL_MODE::D3D11_CULL_BACK;
요렇게 확실하게 와이어 프레임도 뒷면이 컬링되어진다. 차이가 확실히 보임


ps.
렌더링 파이프라인에서
아래와 같은 Set 함수들을 크게 부담 되지 않는다. 이것을 Render 에서 프레임마다 호출하는 것이 좋다고 할 수 는 없지만 차라리 이것말고 다른 부분 최적화하는게 맞다. 의미가 많이 없는 수준이다.
PSSetShader(m_colorPixelShader.Get(), 0, 0);
RSSetState(m_wireRasterizerSate.Get());