Game Develop

[DirectX11] 디퍼드렌더시 아주 사소한 테크닉. 본문

ComputerGraphics/DirectX

[DirectX11] 디퍼드렌더시 아주 사소한 테크닉.

MaxLevel 2022. 9. 27. 14:34

현재 내 프로그램같은 경우 디퍼드렌더링을 사용하고 있다. 

최소 4장(depth,diffuse,normal,specular)의 텍스쳐를 사용해서 최종적으로 출력할 픽셀값을 결정하게 되는데, 각각의 텍스쳐에 값을 기록하는건 GBuffer셰이더에서 하고, 이 텍스쳐를 사용해서 픽셀값 결정하는건 디퍼드셰이더에서 한다.

즉 디퍼드셰이더에서 라이팅연산까지 한 후에 출력하는건데, 문제는 컬라이더도 같이 빛연산이 적용되버려서 출력이 되던것이다. 

 

알다시피 컬라이더는 실제 인게임에서 형태를 출력할일은 없을것이고 디버깅모드에서나 출력할텐데, 출력할때도 초록색 그대로 출력하지, 뭐 라이팅연산 적용해서 출력하진 않는다.

근데 다른 메쉬 렌더링하는것처럼 똑같이 디퍼드렌더링 시키니까 이 컬라이더들이 빛연산이 적용되서 출력이 되는 상황이 발생했다. 디퍼드렌더링을 실제 적용시킨건 좀 예전이긴 한데, 그때는 일단 되기라도 해서 감지덕지라서 임시방편하고 넘어갔었다.

진짜 말 그대로 실제로 사용해선 안될 임시방편이긴 했는데, 디퍼드셰이더에서 rgb중 g값이 0.9이상인값은 그대로 diffuse값 리턴시키는... 사실상 컬라이더의 픽셀만 적용되는게 아닌 g값이 0.9이상인 모든 픽셀은 다 적용되버리는 최악의 임시방편이였다. 

 

이렇게 찝찝한상태로 냅두다가 최근에서야 깊이맵그림자매핑 구현하는 김에 조금 고쳐봤다.

글제목처럼 아주 사소한데, 그냥 안쓰는 채널에 값을 표시하는거다.

어차피 컬라이더는 라이팅연산을 안하기 때문에 텍스쳐 2장에만 값을 기록한다.

하나는 diffuse텍스쳐이고 나머지 하나는 specular텍스쳐인데, diffuse야 당연히 기록해야하는거고 specular는 값기록용 텍스쳐이다. 여기서 값이라함은, 디퍼드셰이더에서 '이 픽셀은 컬라이더 픽셀입니다...'라고 알려주는 값을 말한다.

디퍼드셰이더에서 specular텍스쳐의 r값은 라이팅연산할 때 필요하기 때문에, 안쓰는 채널인 g값에다가 1.0f라고 표시했다.

다른 메쉬들같은 경우 r값을 제외한 g,b에 0.0f값을 세팅하기 때문에 컬라이더픽셀만이 0.0f이상이게 되고, 그러면 디퍼드셰이더에서 텍스쳐를 샘플링할 때 specular텍스쳐에서 샘플링한 g값이 0.0f이상일 경우, 해당 픽셀은 컬라이더픽셀이라 인지하고 픽셀에 diffuse값만 적용시켜 출력시키게 하면 된다.

 

사실 이 방식은 컬라이더까지 디퍼드렌더에서 하려할 경우 쓰는 방법이고... 아직 내가 디퍼드렌더링 후에 포워드렌더링 하는걸 구현안해서 이런 방식으로 한것이다. 곧 구현할 거 같으니 그때 되면 다시 또 코드를 고칠 것 같다.