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

매우 기본적인 셰도우 매핑에다가
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 단에 있다.