본문 바로가기
Directx12 3D 프로그래밍 입문/10. 혼합

10.9 요약 및 연습 문제

by ftftgop3 2023. 11. 2.

요약

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 의 혼합 연산자 및 혼합 계수 변경

Blend OP = D3D12_BLEND_OP_ADD,D3D12_BLEND_OP_MIN, D3D12_BLEND_OP_SUBTRACT

 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); // 조명이 적용된 색상

  1. dist(p, E) = 160,  foggedColor  {x=0.625000000 y=0.625000000 z=0.625000000 ...}
  2. dist(p, E) = 110, foggedColor  {x=0.75 y= 0.75  z= 0.75  ...}
  3. dist(p, E) = 60, foggedColor  {x=0.875 y= 0.875  z= 0.875  ...}
  4. 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)