그래픽스/DirectX12

[Directx12][10장]혼합

우향우@ 2023. 3. 21. 21:43

개요

혼합 설정은 깊이판정에 성공한 픽셀 단편이 기존 후면버퍼의 해당 픽셀을 덮어쓸때 어떤식으로 덮어쓸지를 정할 수 있는 설정이다.

지금까지는 완전히 불투명한 물체들을 상정한 기본 혼합을 사용했다. 이는 깊이 판정에 성공한 픽셀단편이 기존 색상을 완전히 덮어씌우는 방식이 사용된 것이라고 보면된다.

혼합 공식

혼합 방식은 다음과 같은 혼합 공식으로 정의된다.

여기서 src는 새 픽셀 단편이며 dst는 기존 후면버퍼 픽셀 색상이다.

[#]은 설정가능한 이항연산중 하나이다.

새 후면버퍼 픽셀 색상(rgb) = src색상 ⓧ src 혼합 계수 [#] dst색상 ⓧ dst 혼합 계수

새 후면버퍼 픽셀 색상(a) = srcA ⓧ srcA 혼합 계수 [#] dstA색상 ⓧ dstA 혼합 계수

이 공식들에서 4가지 혼합계수와 두가지 [#]은 각각 정의된 열거형들로 설정할 수 있으며 이러한 설정 조합들로 다양한 효과들을 낼 수 있다.

[#]은 더하기, 빼기, 반대로 빼기, min, max, 논리연산등이 있다.

혼합 계수는 1,0, a값, 설정한 상수값, 이것들의 역 등이 있다.

혼합 사용 예제

대표적인 혼합 사용 예제들은 다음과 같다.

1. 색상 기록 금지

src 혼합 계수를 0, dst 혼합계수를 1로 하면 후면버퍼는 초기상태에서 전혀 갱신되지 않으며 깊이 버퍼만 갱신되는 렌더링이 수행된다. 깊이 버퍼만 갱신하고 싶을 때 사용하는 작위적인 기법이다.

2. 가산 혼합

각 혼합계수를 1, 혼합연산을 더하기로 하면 곂치는 부분들이 더욱 밝게 빛나는 가산 혼합이 된다.

3. 감산 혼합

가산 혼합에서 연산만 빼기로 만든다. 곂치는 부분들이 더욱 어둡게 된다.

4. 승산 혼합

src 혼합계수를 0으로, dst 혼합계수를 src rgb 색상으로 하고 더하기를 사용한다. src의 rgb가 계속 곱해지는 효과가 나온다. 곂칠수록 어두워지는 방향이다.

5.투명도

src 혼합계수를 srcA값으로, dst 혼합계수를 1-srcA값으로 설정하고 더하기를 하면 alpha만큼 불투명한 물체를 나타내는 투명효과를 낼 수 있다. 여기서 중요한 것은 교환법칙이 적용되지않기에 먼 픽셀에서 가까운 픽셀순으로 렌더링해야 적절한 효과를 낼 수 있다.

혼합 깊이 처리

위 예제에서 1은 신경쓸게 없지만 2~5는 다음과 같이 처리해야한다.

2~4는 완전히 불투명한 물체들을 기존 방식으로 먼저 렌더링한다. 그 후 깊이 버퍼 갱신만 비활성화하고 반투명 물체들에 대해서 혼합 렌더링을 수행한다. 그렇게 하면 최종적인 불투명 물체 앞의 반투명 물체들에 혼합이 적용된다.

5의 경우 완전히 불투명한 물체들을 기존 방식으로 먼저 렌더링한다. 그 후 반투명한 물체들을 먼 물체부터 가까운 물체 순으로 혼합 렌더링을 수행한다. 이렇게 하면 물체들이 서로 겹치치 않았다는 가정하에 정상적인 혼합이 적용된다. 하지만 반투명한 물체들이 겹칠경우에는 픽셀 처리 수준에서의 깊이 순서 처리가 필요하다. 이 책에서는 물체순서까지만 고려한다. (예제에는 반투명 물체가 애초에 하나기에 아예 처리가 없다.)

픽셀 잘라내기

픽셀 셰이더에는 clip(x)라는 함수가 있다. 이는 x의 값이 0보다 작으면 해당 픽셀을 더 이상 처리하지않고 배제 시킨다. 이를 이용해 alpha값이 0에 가까운 픽셀을 제외하여 성능을 향상 시킬 수 있으며 혼합 기법을 사용하지 않고도 alpha가 0인 텍스처들을 투명처리 할 수 있다.

안개

특정한 기상 표현, 대기 원근 표현을 위해서나 먼 화면의 물체 처리 결함을 숨기기 위해 안개 효과가 사용된다. 안개 효과는 여러 방법이 있지만 선형 안개 효과는 다음과 같이 구현한다.

각 픽셀 단편에 대해 기존 최종 색상에 다음과 같은 공식으로 최종 색상을 계산해주면 안개효과가 구현된다.

최종 색상 = (1-s)*기존 최종 색상 + s*안개색상

s = 0~1클리핑( (카메라픽셀거리 - 안개 시작 거리) / 안개 범위 ) 

s값을 쉽게 말하면 카메라픽셀거리가 0~안개 시작 거리일때는 0, 안개 시작 거리 ~ 안개 끝 거리일때는 0~1, 안개 끝 거리 이상일때는 1이 된다.

 

 

 

 

참고서적

DirectX 12를 이용한 3D 게임 프로그래밍 입문

'그래픽스 > DirectX12' 카테고리의 다른 글

[Directx12][12장]기하셰이더  (0) 2023.03.21
[Directx12][11장]스텐실  (0) 2023.03.21
[Directx12][~9장][실습]Block Game  (0) 2023.03.21
[Directx12][9장]텍스처  (0) 2023.03.21
[Directx12][8장][2]HLSL 구조체 채우기  (0) 2023.03.21