[DirectX11 Pipeline] 6. Output Merger

SYiee·2023년 8월 19일
1
post-thumbnail

🖤 Output-Merger Stage

📌 스크린에 보이는 color를 정해주는 단계

→ 오브젝트별로 결정된 칼라들을 다 모아서 최종적으로 보이는 스크린에 어떻게 보여줄지 정해야한다.
→ 이전 포스트인 Pixel Shader 시간에 결정한 것은 픽셀의 color를 정한 것이다.
→ 이제 이것을 스크린로 가지고 오는 단계가 Output-Merger Stage 이다.

  • Depth-Stencil Test
  • Color Blending

The output-merger (OM) stage generates the final rendered pixel color using

  1. a combination of pipeline state,
  2. the pixel data generated by the pixel shaders,
  3. the contents of the render targets,
  4. and the contents of the depth/stencil buffers.

⇒ 위에 것들을 이용해 최종적으로 OM 을 결정

Pipeline state 란?

  • cpu에서 gpu를 넘길 때 DESC(option, GPU가 어떻게 동작해야할지에 대한 내용)을 같이 넘긴다.
    → This includes common settings such as the rasterizer state, blend state, and depth-stencil state, as well as the primitive topology type of the given geometry information and the shader states.

  • In Direct3D 12, 파이프 라인 스테이트를 PSO에 넣어 준다. 이런 PSO DESC 구조체를 GPU에 넣으면 이에 맞게 렌더링 해준다.

  • initialization time에 PSO가 여러개 생성되기도 한다.

  • 보통 DESC에는 default 값이 있다.

In the reference topic for the D3D12_GRAPHICS_PIPELINE_STATE_DESC presents all of the different pipeline states.

Render Target

  • A render target is a resource or object that can receive drawing commands. 렌더타겟이라 불리는 도화지
  • Render targets enable a scene to be rendered to a temporary intermediate buffer, rather than to the back buffer to be rendered to the screen.
    현재 보여주는 도화지 이외의 별도의 도화지를 그리고 바꿔서 쓴다

framebuffer

  • color data를 저장
  • 색상 데이터를 저장하는 RAM의 한 부분

back buffer

  • framebuffer에 의존
  • 지금 내가 화면에 보여주고 있는 것과 연결된 메모리 공간은 font buffer라고 하고 앞으로 다음 프레임에 보여줄 것을 back buffer & secondary buffer라고 한다.

📌 Depth-Stencil Testing

  • A depth-stencil buffer (texture resource), can contain both depth data and stencil data.
  • depth data : 어떤 픽셀이 카메라에 가장 가까이 있는가를 결정
    • 큐브 뒤에 원뿔이 있으면 카메라에는 빨간색에 해당하는 큐브가 나와야지 파란색 원뿔이 나오면 안된다.
  • Stencil data : 마스킹을 할때 사용, 업데이트를 할까 말까 결정
  • OM 은 이를 이용해 픽셀 값을 최종적으로 결정

✔ Depth Test

  • 어떤 것이 앞에 있어 먼저 그릴지 판단하는 것을 depth buffering이라고 한다. 혹은 z-buffering 이라고도 한다.

    • Z-buffering : Z-buffer의 정보를 이용하여 Clip Space에서 앞에있는 것과 뒤에 있는 것을 처리해주는 과정
  • depth value가 output-merger stage에 들어오면 항상 clamp된다.

  • per-samle operation

  • depth test는 어떤 것이 보이는지 어떤 것이 가려져 있는지 결정한다.

  • 생성된 픽셀이 현재 depth value와 비교해서 가까이 있냐 멀리 있냐를 판단하는데 누가 이 자리를 차지할 수 있을지 싸우는 것 z-buffering 이다.

  • pixel depthstored depth value보다 작으면 원래 그 자리의 주인보다 앞에 있으니 바꾼다.

  • Z-buffering은 처리되는 순서와 상관없이 일정한 결과를 가진다.

EX1

✔ Stencil Test

A simple example of a stencil buffer is shown below

  • Transition effect
  • Discarding UI area
    UI 부분만 빼고 업데이트


📌 Color Blending

depth test에서는 픽셀이 나를 그리게 할 것인지 버리게 할 것인지, 앞에 있는 것만 렌더링 해야해서 이것을 판단했다. 하지만 어떤 표면은 반투명한 것들도 존재를 한다.
이에 블렌딩을 이용해 몇 가지 픽셀 값을 합쳐 최종 픽셀 값을 정한다. 모든 픽셀 셰이더의 아웃풋에서 perform이 되고 output value가 render target에 그려지기 전에 계산이 된다. (per-pixel)

The blending process uses the alpha (α) value of the fragment.

  • The alpha value represents 256 degrees of opacity:
    • 0 denotes “fully transparent” 완전 투명
    • 255 denotes “fully opaque”. 완전 막힘(벽)
  • For the opacity representation, the normalized range [0, 1] is preferred to the integer range [0, 255].

The blending equation

  • α : pixel의 불투명도

Blend State
In DX12, the blend state is set by pipeline state object (PSO).

Keeping Destination Pixel Example

새로들어온 것이 차지를 못하게 하고 싶을 때, 아래와 같이 설정을 할 수 있다.

  • the source pixel blend factor to D3D12_BLEND_ZERO
  • the destination blend factor to D3D12_BLEND_ONE
  • the blend operator to D3D12_BLEND_OP_ADD.

  • 예를 들어 항상 앞에 있어야 하는 UI가 있다.
    종료버튼 같은 것들! 가장 다른 거에 비해 맨 앞에 있어야 한다.

🌊 Alpha Blending (Transparency)
alpha blending에서는 primitives가 무작위로 생성되서는 안된다. 먼저 불투명한 것을 렌더링 해주고 back-to-front-order로 렌더링 해줘야 한다.

→ 불투명한 것들 먼저 렌더링

→ 투명한 것들을 뒤에서 앞으로 렌더링 해준다.

souce 픽셀이 몇버펜트 정도 통과할 지 정하는 것

  • 가장 많이 사용되는 세팅은 다음과 같다

  • 그러면 다음과 같은 식이 나온다


🖇 Reference

해당 포스트는 강형엽 교수님게임그래픽프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊

profile
게임 개발자

0개의 댓글