픽셀 셰이더가 생성한 픽셀 단편들은 출력 병합기 단계의 입력으로 들어가는데, 이때 깊이 판정이나 스텐실 판정에 의해 기각되지 않은 픽셀 단편들은 후면 버퍼에 기록된다.

혼합은 출력 병합기 단계에서 일어나며, 후면 버퍼에 이미 기록된 픽셀을 완전히 덮어쓰는 것이 아니라 일정한 공식에 따라 새 픽셀과 기존 픽셀을 섞은 결과를 기록하는 것이다.

 

10.1 혼합 공식

1. 현재 후면 버퍼에 있는 대상 픽셀 rgb색상 * 혼합계수1

2. 원본 픽셀에 대해 출력한 rgb색상 * 혼합계수2

혼합 연산자로 1, 2 를 계산

 

둘을 혼합 연산하면 새로운 색상을 얻을 수 있다.

색상의 알파값에도 혼합 공식을 따로 적용할 수 있다.

10.4 혼합 상태

PSO에 D3D12_BLEND_DESC를 서술하여 설정한다.

ㄴ 알파 포괄도 변환 활성화 여부

ㄴ 렌더 대상마다 혼합을 다른 방식으로 할 것인지 여부

ㄴ D3D12_RENDER_TARGET_DESC 배열 렌더 대상마다 혼합을 다른 방식으로 할 경우 원소마다 다른 혼합 설정이들어간다. 렌더 대상들에 동일한 혼합 방식을 적용할 경우 0번 인덱스의 혼합 설정이 사용된다.

 

D3D12_RENDER_TARGET_DESC 구조체

ㄴ 논리 연산 할것인지 혼합 연산 할것인지 지정

ㄴ rgb 혼합 계수 두개

ㄴ rgb 혼합 연산자

ㄴ 알파 혼합 계수 두개

ㄴ 알파 혼합 연산자

ㄴ 논리 연산자 

ㄴ 렌더 대상 쓰기 마스크 (혼합의 결과가 기록될 후면 버퍼 색상 채널을 결정한다. R G B A)

 

10.5 혼합 연산 예제

가산, 감산, 승산(곱셈)

투명도

ㄴ 반투명한 물체를 그리는데 사용할 수 있다.

ㄴ 이 혼합 방식으로 반투명을 구현한다면 혼합을 사용하지 않는 물체를 먼저 그리고, 혼합을 사용하는 물체들은 카메라에서 먼 물체부터 차례대로 정렬한 뒤 그려야 한다.

ㄴ 가산, 감산, 승산 혼합의 경우 혼합을 사용하지 않는 물체는 먼저 그려야 하지만 혼합을 사용하는 물체들끼리 정렬할 필요는 없다. 교환 법칙을 만족하기 때문에

 

ㄴ 혼합 물체를 그릴때는 깊이 판정을 꺼야 한다. 혼합 물체에 의해 가려진 물체의 픽셀 단편이 제거되어 색이 날아가 버리기 때문이다.

 

10.6 알파 채널

분산광 텍스처 맵에 담긴 알파 채널을 사용하여 색상의 알파값을 원본 색상읠 알파 값을 지정한다.

 

10.7 픽셀 잘라내기

픽셀 셰이더에서 clip 함수를 사용하여 투명에 가까운 픽셀을 잘라낼 수 있다. (해당 픽셀에 대한 계산이 더 이루어지지 않는다.)

ALPHA_TEST가 정의되어 있는 경우에만 clip을 사용하도록 해야 한다.
알파 판정에는 비용이 따르므로 필요한 경우에만 사용해야 한다.

10.8 안개

절두체의 먼 평면 뒤에 있던 물체가 카메라가 이동함에 따라 절두체 안으로 들어오면서 갑자기 화면에 튀어나오는 파핑 현상을 숨길 수 있다.

ㄴ 패스 상수 버퍼에 안개 색상, 안개 시작 거리, 안개 범위 값을 넘긴다.

ㄴ 정점과 시점의 거리에 따라 안개의 비율을 계산하여 안개 색상과 계산한 픽셀 색상을 보간하여 최종 색상을 결정한다.

 

연습문제

2. 이번 장의 혼합 예제('BlendDemo')를 물을 제일 먼저 렌더링하도록 수정하고, 그 실행 결과를 설명하라.

혼합 물체인 물을 가장 먼저 렌더링하면 물 아래에 있는 땅이 보이지 않는다.

5. 혼합 예제를, 적색 채널과 녹색 채널로의 색상 기록을 비활성화하는 혼합 상태를 생성해서 혼합에 적용하도록 수정하라.

혼합의 결과가 Blue와 Alpha 채널에만 기록되어서 물이 더 푸르스름하게 보인다.
물을 그릴 때 사용되는 파이프라인 객체 transparent pso를 만들때 혼합 상태를 정의하는데 이 때 렌더 대상 쓰기 마스크를 설정할 수 있다.

연습문제 파일

https://github.com/lemonyun/Directx12_study/tree/main/10/Chapter%2010%20Blending/BlendDemo

 

GitHub - lemonyun/Directx12_study: 2022/06/10

2022/06/10. Contribute to lemonyun/Directx12_study development by creating an account on GitHub.

github.com

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

12. 기하 셰이더  (0) 2022.06.24
11. 스텐실 적용  (0) 2022.06.22
9. 텍스처 적용  (0) 2022.06.21
8. 조명  (0) 2022.06.20
7. Direct3D의 그리기 연산 제2부  (0) 2022.06.17

+ Recent posts