본문 바로가기

DX

와이어 프레임

레스터라이저 단계에서 픽셀을 그릴 때 그 형식을 바꿀 수 있다. 우리가 아는 보통의 그리기는 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());

'DX' 카테고리의 다른 글

격자 평면 만들기  (0) 2025.07.12
노멀 벡터 그리기  (0) 2025.07.06
퐁 vs 블린 퐁  (0) 2025.06.16
조명  (0) 2025.06.16
텍스처링  (0) 2025.06.16