티스토리 뷰

Game/MMD

NCHL Shader (2)

newpolaris 2017. 11. 28. 12:06

F0 대신 Specular를 사용할 수 있단다

https://en.wikibooks.org/wiki/GLSL_Programming/Unity/Specular_Highlights_at_Silhouettes#Schlick.27s_Approximation_of_the_Fresnel_Factor

In other words, the Fresnel factor adds a dependency of the material color on the angle between the direction to the viewer and the halfway vector. 
Thus, we replace the constant material color with Schlick's approximation  in any calculation of the specular reflection.

어짜피 Fresnel term은 작아서 빛과 정반대가 되지 않으면 효과는 없다

검은색이 보기 좋진 않다.

http://www.valvesoftware.com/publications/2008/GDC2008_StylizationWithAPurpose_TF2.pdf

MMD 에서는 이 역활로 Toon 이라는 넘이 있다

그런데 shadow를 쓰면 이걸 안쓰고

    comp = GetShadow( input.shadowPositionCS, input.positionCS.xyz );
    diffuseShadow *= MaterialToon;
    float3 diffuse = lerp(diffuseShadow, diffuseMaterial, comp);

Toon 의 가장 어두운 한점을 가지고 lerp 를 취한다

specular term 을 D는 Beckmann, G는 cook-torrance

http://simonstechblog.blogspot.kr/2011/12/microfacet-brdf.html https://en.wikipedia.org/wiki/Specular_highlight

D term 해설 http://lifeisforu.tistory.com/351?category=567143

하프 벡터 h 와 미세면 노멀 m 의 각도가 0 이 되는 미세면의 분포를 찾는 것이 Specular D 함수의 목적입니다. 
그러므로 어떤 문헌들에서는 이런 가정을 깔고 "하프 벡터가 미세면의 노멀이다" 라는 식의 표현을 하게 되는 것입니다.

그냥 더해버리면 약간이라 specular를 가진다면 흰색으로 떠버린다;

NCHL 에서는 이걸 막기 위해 0.1 을 곱해준다

좀더 찾아보니,

http://lifeisforu.tistory.com/306

k 는 diffuse 계수입니다. 
( 1 - k ) 가 들어 가는 것은 에너지 보존을 위해서입니다. 
그리고 rs 는 specular 항입니다.

이런것도 있고,

https://computergraphics.stackexchange.com/questions/2285/how-to-properly-combine-the-diffuse-and-specular-terms

Sébastien Lagarde even states that using (1−F0) to weight the diffuse term is incorrect.

답변은 아래와 같다.

Lerp(diffuse, specular, total_surface_reflection)

저 위의 (1-F0) 는 아래 2개 링크에서

http://simonstechblog.blogspot.kr/2011/12/microfacet-brdf.html

http://renderwonk.com/publications/s2010-shading-course/gotanda/course_note_practical_implementation_at_triace.pdf

결국, 앞에서의 이야기 종합한다면 다 비슷한 소리다.

(c_diff + c_spec) <= 1 이라면 (1-Fresnel) 이 추가로 필요없다는 건데,

c_spec 은 specular 계수이고,

예전의 specular_material 를 F0 로 러프하게 가정한다면

diffuse의 계수는 1-F0 = 1 - specular_material

의미는 알 수 없지만 합은 1이다.

specular term 의 F0 를 sepcular_material 를 썼다면

Hemisphere

http://blog.naver.com/lifeisforu/80023387725

ambient를 1로

ambient를 0.2로 그결과 앞보다 밝아짐;

Rim 이란 factor가 있는데 Backlight 랑 막 곱한다;

이건 나중에 보고

Rim light

너무 광할하다

https://www.slideshare.net/leemwymw/wrapped-diffuse

http://rapapa.net/?p=2381

뒤에걸 보면 rim 을 dot(L, normal) 으로 곱해준다.

http://www.gamedevforever.com/35

요즘엔 림라이트셰이더 rim-light shader로 많이들 fake하는데 바로 이 프레넬효과를 immitate하는 것입니다.  

사실인지는 모르겠지만 그렇다하면 버리자.

우선 Rim의 이름을 가졌지만 backlight의 림 부분만 땃다고 보고 따라가보자.

5배 factor의 경우

목표는 아래다.

머 이케 차이나는지

'Game > MMD' 카테고리의 다른 글

NCHLShader (4)  (0) 2017.11.29
NCHL Shader (3)  (0) 2017.11.29
NCHL Shader (1)  (0) 2017.11.27
Skinning (2)  (0) 2017.11.27
Motion Blur (1)  (0) 2017.11.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크