알파채널을 포함한 셰도우매핑

알파채널을 포함한 셰도우매핑


AlphaShadow0.png


매우 기본적인 셰도우 매핑에다가

RGBA 텍스쳐를 쓴다고 해도

결국 셰도우 맵 찍을 때에

그 텍스쳐의 알파값을 고려하지 않는다면

걍 그 메시 형태가 기록된다.

알파가 1보다 작은 경우,

셰도우 패스에서

각 메시를 그릴 때 텍스쳐를 참조해서 -

if (texture(uTexture, TexCoord).a < 1.0) discard;

이런 식으로 픽셀을 폐기해 주면

위 사진처럼

복잡한 형태의 그림자를 만들 수 있다.


더 나아가기.

유니티에는 그림자 맵에

그냥 뎁스값만 기록하지 않고

모든 픽셀에 대해서 float opacity [0, 1] 값을

추가적으로 담는 옵션이 있다.

(당연히 말이 '담는' 거지, MRT 쓰는거다

out float FragOpacity;)

셰도우 맵 패스에서

위 텍스쳐의 알파값이

'1인가? 아니면 1보다 작은가?'

이렇게 이분법적으로 생각하지 말고,

그 알파값을 opacity에 적용해서

추후에 그림자를 적용할 때

해당 opacity에 따라서

그림자의 세기를 적절히 변형해 주면

'반투명한 유리'

'얼룩 낀 렌즈'

이런 걸 만들 수 있다.


여기서 또 나아가 보면,

빨간색 스테인글라스같은걸 구현하고 싶다면

유리에 투과된 후의 그림자는

빨간빛을 가지기 때문에,

셰도우 맵 패스에서

shadowColorRGB + opacity

이렇게 2개를 저장해 두면

그림자에 색을 적용할 수 있게 된다.

이를 대충 Transmission Map 라고도 한다.

'이 메시에 빛이 얼마나 통과(transmission)되는가' 를 결정하기 때문에.

Material 단에 있다.