📌 스크린에 보이는 color를 정해주는 단계
→ 오브젝트별로 결정된 칼라들을 다 모아서 최종적으로 보이는 스크린에 어떻게 보여줄지 정해야한다.
→ 이전 포스트인Pixel Shader
시간에 결정한 것은 픽셀의 color를 정한 것이다.
→ 이제 이것을 스크린로 가지고 오는 단계가Output-Merger Stage
이다.
- Depth-Stencil Test
- Color Blending
The output-merger (OM) stage generates the final rendered pixel color using
⇒ 위에 것들을 이용해 최종적으로 OM
을 결정
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.
framebuffer
back buffer
depth data
: 어떤 픽셀이 카메라에 가장 가까이 있는가를 결정Stencil data
: 마스킹을 할때 사용, 업데이트를 할까 말까 결정어떤 것이 앞에 있어 먼저 그릴지 판단하는 것을 depth buffering
이라고 한다. 혹은 z-buffering
이라고도 한다.
depth value가 output-merger stage에 들어오면 항상 clamp된다.
per-samle operation
depth test는 어떤 것이 보이는지 어떤 것이 가려져 있는지 결정한다.
생성된 픽셀이 현재 depth value와 비교해서 가까이 있냐 멀리 있냐를 판단하는데 누가 이 자리를 차지할 수 있을지 싸우는 것 z-buffering 이다.
pixel depth가 stored depth value보다 작으면 원래 그 자리의 주인보다 앞에 있으니 바꾼다.
Z-buffering은 처리되는 순서와 상관없이 일정한 결과를 가진다.
EX1
A simple example of a stencil buffer is shown below
depth test에서는 픽셀이 나를 그리게 할 것인지 버리게 할 것인지, 앞에 있는 것만 렌더링 해야해서 이것을 판단했다. 하지만 어떤 표면은 반투명한 것들도 존재를 한다.
이에 블렌딩을 이용해 몇 가지 픽셀 값을 합쳐 최종 픽셀 값을 정한다. 모든 픽셀 셰이더의 아웃풋에서 perform이 되고 output value가 render target에 그려지기 전에 계산이 된다. (per-pixel)
The blending process uses the
alpha (α) value
of the fragment.
The blending equation
Blend State
In DX12, the blend state is set by pipeline state object (PSO).
Keeping Destination Pixel Example
새로들어온 것이 차지를 못하게 하고 싶을 때, 아래와 같이 설정을 할 수 있다.
🌊 Alpha Blending (Transparency)
alpha blending에서는 primitives가 무작위로 생성되서는 안된다. 먼저 불투명한 것을 렌더링 해주고 back-to-front-order로 렌더링 해줘야 한다.→ 불투명한 것들 먼저 렌더링
→ 투명한 것들을 뒤에서 앞으로 렌더링 해준다.
souce 픽셀이 몇버펜트 정도 통과할 지 정하는 것
해당 포스트는 강형엽 교수님의 게임그래픽프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊