Wrapped Diffuse Shader Study Wrapped Diffuse 2 subsurface
Wrapped Diffuse 이민웅 Shader Study
Wrapped Diffuse • 팀 포트리스 2에서 사용 • subsurface scattering, area light source, 더 부드러운 reflectance 를 표현하기 위해 서 Hemisphere(반구)를 감싸는 셰이딩 모 델 Lambert Wrapped Diffuse
Wrapped Diffuse • Harf. Lambert 공식과 비슷함 – W=1이면, Half Lambert 공식 • Half Lambert와 유사하게 투과되는 느낌을 표현하는데 많이 사용 – 피부, 나뭇잎, 파티클 라이팅에 주로 사용 기본 Lambert Diffuse 공식 float diffuse = max(0, dot(normal, lightdirection)); 기본 Half. Lambert Diffuse 공식 float halflambert_term = dot(normal, lightdirection) * 0. 5 f + 0. 5 f Wrapped Diffuse 공식 float diffuse = saturate((dot(normal, lightdirection) + OFFSET) / (1. 0+OFFSET ));
Wrapped Diffuse Wrapped SH 자세한 내용 http: //blog. selfshadow. com/2011/12/31/righting-wrap-part-1/ http: //blog. selfshadow. com/2012/01/07/righting-wrap-part-2/ Wrap Shading www. iro. umontreal. ca/~derek/files/jgt_wrap. pdf
Wrapped Diffuse • 팀 포트리스 방식 – Wrapped Function은 Half Lambert를 이용해 서, 1 D Wrapped Diffuse Texture에서 값을 얻 어오는 것 – GPU Gems 16. Real-Time Approximation to Subsurface Scattering • Wrap Lighting 계산 내용을 미리 Texture로 저장하 여 사용함
Warp. Tex Lambert Half Lambert Squared Half Lambert (Not used) Warping Function illuminance( P, n, PI) { Ln = normalize(L); halflambert +=. 5*(Ln. nf)+. 5; float chl = clamp(halflambert, 0. 01, 1); accumulate. Map. Color = texture(warp, chl, 0)*2; hlsw_clrlght += Cl*accumulate. Map. Color; } diffusecolor = albedocolor * (Ka + hlsw_clrlght); Light Color Ambient Albedo Ka : ambient Cl : Light. Color http: //www. sfdm. scad. edu/faculty/mkesson/vsfx 419/wip/spring 11/eric_kurzmack/toon. html
Specular Fresnel Primary Specularity Mixed Specular Upward Ambient Rim Fresnel Final Mix http: //www. sfdm. scad. edu/faculty/mkesson/vsfx 419/wip/spring 11/eric_kurzmack/toon. html Rim Specular
Code Specular Fresnel vector i= normalize(-I); float fres=spline((nf. i), 1, 1, 1, . 95, . 6); Primary Specularity illuminance( P, n, PI/2) { Ln = normalize(L); vector R = reflect(-Ln, nf); ridot += clamp(max(0, (R. i)), . 01, . 99); phngspec += (1 -fres)*pow(ridot, spec. E); } Rim Fresnel vector i= normalize(-I); float rimfres=pow((1 -(nf. i)), 2); vector i= normalize(-I); Rim Specular illuminance( P, n, PI/2) { Ln = normalize(L); vector R 2 = reflect(Ln, nf); ridot 2 += clamp(max(0, (R 2. i)), . 01, . 99); phngrim += rimfres*pow(ridot 2, Krim); } Mixed Specular illuminance( P, n, PI/2) { Ln = normalize(L); vector R = reflect(-Ln, nf); vector R 2 = reflect(Ln, nf); ridot += clamp(max(0, (R. i)), . 01, . 99); ridot 2 += clamp(max(0, (R 2. i)), . 01, . 99); phngspec += (1 -fres)*pow(ridot, spec. E); phngrim += rimfres*pow(ridot 2, Krim); phngmix += Cl*Ks*(max(phngrim, phngspec)*2); } speccolor = phngmix; Upward Ambient Rim float upward = clamp((nf. vector(0, 1, 0)), 0, 1); float uprim= upward*rimfres*Kr*(Ka*5); Final Mix Ci = Oi*(diffusecolor+speccolor+uprim);
Q&A
참고자료 • Wrap Shading : http: //www. iro. umontreal. ca/~derek/publication 8. htm l • Energy-Conserving Wrapped Diffuse • Wrapped Diffuse와 팀포트리스 셰이딩 : http: //cagetu. egloos. com/5621806 • 팀포트리스 셰이딩 따라해보기 : http: //cagetu. egloos. com/4212681 • Energy Conservation in Games : http: //www. rorydriscoll. com/2009/01/25/energyconservation-in-games/ • http: //www. gamedevforever. com/150 • http: //cagetu. egloos. com/5621806
- Slides: 10