요약
1. 혼합은 현재 레지스터화 픽셀 과 후면 버퍼에 이미 레스터화 된 픽셀의 섞는( 결합 ) 기법
물이나 유리 같은 반투명 물체를 렌더링 한다
2. 혼합 공식
$ C= C_{src}\bigotimes F_{src}\bigoplus C_{dst} \bigotimes F_{dis}$
$ A= A_{src}\bigotimes F_{src}\bigoplus A_{dst} \bigotimes F_{dis}$
RGB 성분들과 알파 성분들을 개별적으로 혼합, 이항 연산자로 여러 연산자를 사용 할 수 있다
3. $C : F_{src} F_{dis} , A : F_{src} F_{dis} $ 혼합 계수
컬러, 알파 등으로 혼합 공식을 커스텀 화 하는 수단으로 사용 된다
4. 분산 재질의 알파를 원복 픽셀의 알파로 사용, 텍스처의 알파 채널에 알파 정보가 들어 있다
5. 내장 HLSL 함수 Clip(x) 사용하면 원복 픽셀을 기각 할 수 있다, 즉 완전히 투명한 픽셀, 불투명한 픽셀
들을 렌더링 할 때 유용,
기각 시 추가적으로 혼합 계산을 하지 않는다.
6. 안개는 멀리있는 렌더링 결합을 숨기거나, 파핑을 숨기는 용도로 사용
픽셸 셰이더는 삼각형의 한점의 색상을 색상과 안개 색상의 가중 평균으로 구한다
표면 점과 카메라의 멀수 록 안개에 더 많이 묻힌다
$$ foggedColor = litColor + s(fogColor - litColor)\\
foggedColor =(1-s) \cdot litColor + s \cdot fogColor$$
연습 문제
1. blendDemo 의 혼합 연산자 및 혼합 계수 변경
2. 물을 가장 먼저 렌더링 후 결과 설명
물 먼저 렌더링 시 이번에 후면 버퍼에 아무 색상이 없기 때문에 물 색상이 그래도 렌더링
지형 먼저 렌더링 시 후면 버퍼에 지형 색상이 이미 저장 되어 있기 때문에 물 색상 과 혼합 된다.
3. forstart = 10, fograndge 200 일때 의 foggedColor 값 을 계산
XMFLOAT4 gFogColor = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f); // 안개 색상
XMFLOAT4 litColor = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); // 조명이 적용된 색상
- dist(p, E) = 160, foggedColor {x=0.625000000 y=0.625000000 z=0.625000000 ...}
- dist(p, E) = 110, foggedColor {x=0.75 y= 0.75 z= 0.75 ...}
- dist(p, E) = 60, foggedColor {x=0.875 y= 0.875 z= 0.875 ...}
- dist(p, E) = 30, foggedColor {x=0.95 y= 0.95y z= 0.95y ...}
4. ALPHT_TEST 정의 하지 않고 컴파일한 픽셀 셰이더에 실제로 discard 명령어 존재 확인
셰이더 빌드 시 ALPHT_TEST 제외, ALPHT_TEST 동작 하는 것 처럼 렌더링 한다
float4 PS(VertexOut pin) : SV_Target
{
float4 diffuseAlbedo = gDiffuseMap.Sample(gsamAnisotropicWrap, pin.TexC) * gDiffuseAlbedo;
#ifdef ALPHA_TEST
// Discard pixel if texture alpha < 0.1. We do this test as soon
// as possible in the shader so that we can potentially exit the
// shader early, thereby skipping the rest of the shader code.
clip(diffuseAlbedo.a - 0.1f);
#endif
if (diffuseAlbedo.a - 0.1f < 0)
discard;
}
5. 적색 채널, 녹색 채널로의 색상 기록을 비활성화 하는 혼합 상태를 생성 후 적용
오른쪽은 물 렌더링 시 적색, 녹색 색상을 제외 후 혼합 한 결과
참고 및 내용 인용
프랭크 D 루나 지음, 류광 옮김
한빛 미디어
Directx 12를 이용한 3D 게임 프로그래밍 입문(2017)
'Directx12 3D 프로그래밍 입문 > 10. 혼합' 카테고리의 다른 글
10.8 안개 (1) | 2023.10.28 |
---|---|
10.5 혼합 연산자의 조합 예제 (0) | 2023.10.26 |
10.1 ~4 혼합 공식, 연산, 계수, 상태 (1) | 2023.10.21 |