炸殺
카테고리
작성일
2020. 6. 23. 22:53
작성자
炸殺
Warpped Diffuse 

 

우리의 대인배 벨브님께서 발표한 공식으로 팀포트리스2에서 처음 도입된 쉐이딩 방식입니다.

 

셀쉐딩에서 극단적인 명암을 주기 위해 if문과 ceil함수를 사용했었는데요, 

if문은 무겁다는 단점이, ceil은 명암단계의 간격을 조절할 수 없다는 단점이 있었습니다.

 

하지만 Warpped Diffuse 공식은 이 두가지 단점을 한 방에 해결해버렸습니다.

 

 

 

 

 

Warpped Diffuse를 구현해보기 위해 가장먼저 기본적인 NdotL커스텀 라이트를 만들어줍니다.

 

취향껏 하프 램버트 공식도 넣었다.

 

그리고 Ramp 텍스쳐를 하나 받아오는데,

이때 해당 텍스쳐의 uv는 받아오지 않습니다. void surf에도 안불러옵니다!

 

바로 커스텀 라이트에 tex2D함수로 새로 만든 텍스쳐를 불러와줍시다.

RampTex의 uv를 받아오지 않은데다 커스텀 라이트지만

어차피 uv는 float2 값이기 때문에 원하는 아무 float2값을 적어주기만 하면 오류는 나지 않습니다.

 

위와 같이 uv가 들어갈 항목에 float2값을 넣고 임의의 텍스쳐를 넣어주면....

 

 

uv대신 넣어주었던 좌표에 해당하는 픽셀의 컬러가 오브젝트 전체의 컬러가 되었습니다. 

 

 

텍스쳐가 가로 방향으로 색상이 변화하기 때문에 0에서 1사이의 값을 x값에 넣어주게 되면

입력된 값에 따라 해당 좌표에 위치한 색으로 컬러가 변화하는 것을 확인 할 수 있습니다.

 

 

 

 

 

 

그렇다면..........?

 

float인 NdotL을 x값에 넣어버리면.............?  

 

 

if문을 작성하고.... 컬러를 각각의 영역에 컬러를 조절할 수 있도록 프로퍼티를 만들고... 또 그걸 수치에 맞게 대입하고......

의 모든 과정들이 텍스쳐 한 장으로 해결되었습니다. 

NdotL을 UV로 사용해 버리는 것.

 

Warpped Diffuse의 최대 장점은 그림자의 색상 부터 범위, 블랜딩 등등

거의 대부분의 영역을 전부 아티스트가 원하는 데로 그려버릴 수 있습니다.

 

이렇게 라이팅의 색이 들어있는 텍스쳐를 Ramp 텍스쳐라고 합니다.

Ramp 텍스쳐는 UV 좌표를 사용하므로 Repeat로 설정되어있을 시 맞닿아있는 곳의 색이 묻어나올 수 있기에

Clamp로 설정해줍시다. 또한 퀄리티를 좋게 만들어 압축을 하지 않고 작게 만들어 블렌딩을 해주면

그라데이션이 더 자연스러워집니다.

 

 

 

 

예를 들어서

 

이렇게 역광이 존재하지 않아도 역광을 받는 듯한 효과를 낼 수도 있고,

저렴한 가짜 SSS도 만들어줄 수 있는 것이죠.

 

 

 

 

 

 

Y축 이용하기

 

 

가로 방향을 변화시켜 x축을 사용했으니, UV의 y축을 이용하는 것 역시 당연히 가능합니다.

여기에 림라이트 공식을 UV y값에 넣게 되면?

 

 

2pass 외곽선은 잠시 꺼주었다.

Outline과 Rimlight가 생겨났습니다.

이렇게 만들어진 Outline은 Fresnel 공식을 이용하였기 때문에 평면에서는 정상적으로 작동되지 않습니다.

원리는 다음과 같습니다.

 

 

이렇게 UV x축에 넣어둔 NdotL의 세로 위치는 NdotV의 값으로 결정되고,

UV y축에 넣어둔 NdotV의 가로 위치는 NdotL의 값으로 결정되게 되는 것이죠.

 

반전하지 않은 림라이트 공식의 외각 값은 0이기 때문에

텍스쳐의 하단을 얇고 검게 칠해두면 외각선이 생기게 되며,

그 위에 밝은 색을 올려두었으니 외각선 안쪽으로 림라이트가 맺힌 것처럼 보이게 됩니다.

 

우리의 지난 동고쇼가 단 3줄로 압축되었습니다. 벨브....당신들은....

 

 

이를 응용하면 텍스쳐를 그려 어두운 부분은 두껍고, 밝은 부분은 얇은 외각선을 만들어 줄 수도 있습니다. 

 

 

 

 

 

외각선이나 Rimlight를 넣을게 아니라면

y값에 NdotV를 넣고 안넣고의 차이가 시각적으로 크게 보이지 않아서 비교짤을 한 번 만들어봤습니다.

 

확실히 y값에 NdotV를 넣어준 쪽이 외각으로 갈수록 자연스럽게 어두워지거나,

SSS에 의한 투과 색상이 더 자연스럽게 적용되고 있습니다. 뭔가 더 풍부해진 느낌....

 

 

 

 

림라이트 공식이 Y축이라는 것을 이용하여 SSS 텍스처를 만들어봤습니다.

스페큘러를 추가하거나 텍스쳐를 좀 더 다듬는다면 더 그럴듯한 SSS가 만들어질 것 같습니다.