그래픽(기타)

유니티 SRP 셰이더 그래프 - 9

에페아 2020. 1. 28. 21:39

스펙큘러를 만들어봅시다

 

1. specular

2. phong

3. blin phong

4. specular에 노말 추가하기

 

1. specular

http://viralmarketingnews.com/element-3d-v2-new-specular-model/

이런 하이라이트 맺히는 걸 보고 스펙큘러라고 하네요

그리고 이런 하이라이트들은 

노말 벡터와 대칭되는 쪽에 가장 잘 나타나게 됩니다(정반사라고 하더라고요)

그리고 저 스펙큘러는 뷰벡터에 영향을 받아서

R · V 를 해서 스펙큘러의 최종 결과물이 나오게 됩니다

그럼 이걸 토대로 직접 구현해봅시다

 

2. phong

위에 쓴 원리를 토대로 실제 구현을 해봅시다

위에서 최종 결과물을 뽑아내기 위해서 R dot V를 했었죠

여기서 V는 View Direction이라는 노드를 통해 바로 구할 수 있습니다. 즉, reflection vector만 구하면 되죠

그럼 이 reflection vector는 어떻게 구하느냐

https://toymaker.tistory.com/m/entry/%EB%B0%98%EC%82%AC-%EB%B2%A1%ED%84%B0-Reflection-Vector

 

반사 벡터 ( Reflection Vector )

정반사는 입사벡터와 반사벡터의 크기가 같고, 입사각과 반사각의 크기가 같은것을 말한다. Fig.1 을 보면 입사벡터 P 와 법선벡터 n 이 주어졌을때, 반사벡터 R 은 벡터 P 와 크기가 같고, 입사각과 반사각이 같..

toymaker.tistory.com

여기에 원리가 적혀있는데

암튼 저런 원리로 R = 2N(N dot L) - L 이런식으로 계산을 하면 reflection vector를 구할 수 있습니다

(-L을 한 이유는 라이트벡터의 방향이 반대로 되있기 때문)

노드로 저 공식을 구현한 모습입니다. 노드로 하니까 생각보다 복잡하죠

그래서 따로 reflection 노드를 만들어놨더라고요

이렇게 노말벡터와 들어오는 벡터를 넣어주면 알아서 리플렉션 벡터를 계산해줍니다

근데 지금 라이트벡터에 -1을 곱해서 넘겨주죠

 

리플렉션 노드는 버텍스를 향해 들어오는 벡터에 대한 반사벡터를 반환해주는데,

라이트벡터는 버텍스에서 광원방향으로 향하는 벡터란 말이죠. 그래서 버텍스에서 광원으로 향하는 벡터를 반전시켜서 광원에서 버텍스를 향하는 벡터로 만들어가지고 노드에 넘겨주는 겁니다

 

뭐 암튼 이렇게 해서 리플렉션 벡터를 구했으니 이제 뷰벡터랑 내적을 하면 스펙큘러가 나오겠죠?

리플렉션 노드의 결과와 뷰디렉션을 노멀라이즈한 값을 내적합니다 근데 뭔가 하이라이트라고 하기엔 너무 범위가 크죠

그래서 제곱을 걸어줍시다

한 20쯤 거니까 저렇게 되네요

이게 음수에 power 걸면 출력값이 깨지더라고요 수학적으로는 음수도 제곱 가능할텐데... 암튼 그래서 power를 걸기 전에 clamp로 음수가 되지 못하게 만든 후에 넘겨줍니다

이렇게 만들고 마스터노드에 연결시켜주면

이런 결과물이 나옵니다

이걸 이전에 만든 라이트 셰이더와 더하면

이런식으로 스펙큘러가 먹히는 걸 볼 수 있죠

3. blin phong

저 phong 공식의 연산을 줄여서 비슷한 결과물을 만들어내는 blin phong 공식도 해봅시다

얘는 L+V을 normalize한 값에 N과 내적하면 끝입니다. 연산과정이 훨씬 단축되죠

이런식으로 라이트벡터와 뷰벡터를 더한걸 노멀라이즈하고

그걸 노멀 벡터와 내적을 하는거죠

 

한번 만들어봅시다

대충 phong 공식의 결과와 비슷한 결과가 나옵니다

 

4. specular에 노말 추가하기

노말맵은 우리가 노말을 임의로 바꾸는 것이죠. 즉 노말맵에 나온 벡터값을 기존 노말을 꼽아놓던 곳에 그대로 연결시키면 됩니다

world 스페이스로 바꿔서요.

그럼 이제 결과물을 보면

이런식으로 나오고, 텍스쳐를 추가하면

이런 결과물이 나옵니다

반응형