1 / 32

Cheap Realistic Skin Shading

Cheap Realistic Skin Shading. Stephen Clement. Overview. 일반적인 Skin Models New Skin Model Ideas BRDF Layers Back Scattering Blended Normals Shadows Extras 결과 결론. 일반적인 Skin Models. Red wrapped lighting http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html

Download Presentation

Cheap Realistic Skin Shading

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Cheap Realistic Skin Shading Stephen Clement

  2. Overview • 일반적인 Skin Models • New Skin Model • Ideas • BRDF • Layers • Back Scattering • Blended Normals • Shadows • Extras • 결과 • 결론

  3. 일반적인 Skin Models • Red wrapped lighting • http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html • Texture-space diffusion • http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html • Texture-space diffusion (12-tap) • http://advances.realtimerendering.com/s2010/Hable-Uncharted2(SIGGRAPH 2010 Advanced RealTime Rendering Course).pptx • Screen-space diffusion • http://giga.cps.unizar.es/~diegog/ficheros/pdf_papers/TAP_Jimenez_LR.pdf • Blended Normals • http://advances.realtimerendering.com/s2010/Hable-Uncharted2(SIGGRAPH 2010 Advanced RealTime Rendering Course).pptx • Offline “Fast-Skin Shaders” • http://www.google.ca/#hl=en&source=hp&biw=1920&bih=965&q=fast+skin+shader&aq=f&aqi=g-m5&aql=&oq=&gs_rfai=&fp=bc38547320fe36d4

  4. 일반적인 Skin Models • 가장 현실적으로 표현할 수 있는 기술들이 인기가 있음 • 각 모델에는 장,단점이 있음 • 계산 비용은 매우 저렴하지만 조잡함 • 계산 비용이 크면 퀄리티가 우수함 • 어느정도 완성된(꾸며진) 조명에서는 잘 되지만 날카로운 조명에서는 안좋음 • 그 중간의 대안이 필요함 • 저렴하고 퀄리티가 좋아야 함

  5. New Skin Model • 물리적계산 없음 • 정확한 계산은 않하지만보기에 좋음 • 다른 기술들을의 핵심 개념을 사용함 • Fast-Skin Shader, Human Skin Shader… • 멀티 레이어 사용 • 물리적 기반 BRDF. • 일반적으로 표현해야 할 것 • 그림자 가장자리의 붉은 표현 • 부드러운 표현 • 거친 표현 낮추기

  6. New Skin Model - Ideas • 다른 모델의 개념을 사용 • Kelemen/Szirmay-Kalos BRDF 사용 • 최적화와 상대적으로 계산 비용이 저렴 • 미리 계산하여 텍스쳐를 저장하여 사용함 • “Fast-Skin Shaders”의 멀티레이어를 사용 • 질감레이어 사용 (epidermal(표피), subdermal(피부,진피)). • 조금 블러링 된 Epidermal layer • 많이 블러링 된 Subdermal layer • Diffuse(0.5) + Subdermal(0.2) + Epidermal(0.3) • normal map을 혼합하여부드러운 Blended Normals을 사용

  7. New Skin Model - BRDF • Kelemen/Szirmay-Kalos BRDF 최적화 • beckmanndistribution to texture 저장 • fresnelto texture 저장 • 왜 하나의 specular term을 사용? • beckmann texture 4개의 채널을 가질 수 있음 • 쉐이더에서 계산대신 4개의 float값을 사용 • Weigh them은 간단한 dot product 사용하여 구함 • 추가 비용이 높지 않고 다양한 specularities를 얻음 • 여러부분에서 재사용할 수 있음

  8. New Skin Model – BRDF (Code) Code modified from NVIDIA’s implementation. 미리 계산하여 텍스쳐를 뽑음 정밀하게 계산할 필요가 없음 // Computes beckmann distribution // To bake to texture: texCoord.x = NdotH, texCoord.y = Exp float4 GetBeckmannDistribution( float NdotH, float Exp ) { // Some roughness weights float4 m = half4(1, 0.12, 0.023, 0.012) * (Exp * Exp); float alpha = acos( NdotH ); float ta = tan( alpha ); float4 val = 1.0 / (m * pow(NdotH, 4.0)) * exp(-(ta * ta) / m);    // Scale the value to fit within [0-1]       return 0.5 * pow(  val , 0.1 );   } // Computes fresnel reflectance (can be computed on the fly no problem) // To bake to texture: HdotV = texCoord.x, texCoord.y = F0 float GetFresnelKS( float3 HdotV, float F0 ) { float base = 1.0 - HdotV; float exponential = pow( base, 5.0 ); return exponential + F0 * ( 1.0 - exponential ); }

  9. New Skin Model – BRDF (Code) float KelemenSzirmayTex( float3 N, float3 L, float3 V, float Exp, float F0 ) { // Pretty straightforward float NdotL = saturate(dot(N, L)); float h = L + V; float H = normalize(h); float HdotV = dot(H, V); // Get fresnel from texture; 0.028 is a good value for F0 float fFresnel = tex2D(fresnelTex, float2(HdotV, F0)); // float fFresnel = GetFresnelKS(HdotV, F0 ); // Math version. // Get beckmann distributions from texture float4 fBeckmann = pow(2.0 * tex2D(beckmannSampler, float2(NdotH, Exp)), 10); float4 fSpec = max( (fBeckmann * fFresnel) / dot( h, h ), 0 ); // Weight results using dot product float result = saturate( NdotL ) * dot(fSpec, half4(1.0, 0.625, 0.075, 0.005)); return result; }

  10. New Skin Model – BRDF (Result)

  11. New Skin Model - Layers • 멀티 레이어를만듬 • 레이어 마다 새로운 텍스쳐 생성 • 실제 해상도 보다 텍스쳐가 작으면 비용이 저렴함 • 라이트레이어 • 블러된 상태에서 라이트를 계산 • Diffuse는 않함 • ~0.8 – 0.9 for epidermal. • ~0.7 – 0.8 for subdermal. • 라이트는기본계산만 함 • 각 텍스쳐에 조명을 적용함 • 결과값은 1 • 비율:Epidermal = 0.3, Subdermal = 0.2, Diffuse = 0.5

  12. New Skin Model – Layers (Textures) Diffuse Epidermal Subdermal Back Scattering Specular Normal

  13. New Skin Model – Layers (Image)

  14. New Skin Model – Back Scattering • 매우 간단함 • N·L과 간단한 계산 • 반투명 텍스쳐에 마스크 채널사용 • Subdermal(진피) map 알파채널 사용 • 버텍스칼라값을사용할수도 있음 • 날카로운 그림자를 사용안함 • 소프트 그림자를 사용하여 산란(backscattering)효과 • 다른 방법을 사용할수도 있음 • Translucent shadow maps. • 문제: • 그림자 영역이 재대로 가려지지 않을 수 있음 • 아직 기술이 불완전함

  15. New Skin Model – Back Scattering (Code) float3 BackLighting(float3 lightColor, float NdotL, float shadowMap, float transTex) { // Calculate back scattering. float backLight = lerp(NdotL, 1.0, transTex) - lerp(NdotL, 1.0, 0.4); float3 result = saturate(backLight) * lightColor * shadowMap * backScatterStrength * backScatterColor; return result; }

  16. New Skin Model – Back Scattering (Image)

  17. New Skin Model – Blended Normals • blended normals사용 • 언차티드2 에서 사용 • 버택스노말의N·L 계산과 노말맵의N·L 계산 • 다른 레이어들의 계산을 디퓨즈 채널에 통합 • 각 채널에 대한 강도를 설정 • 완벽하게 부드러운 normal은 필요하지 않음 • 사용할 수 있는 좋은 범위: • Red = 0.5 – 0.7 • Green/Blue = 0.15 – 0.4 • Intensity 는 설정할수 있음 • 0-1

  18. New Skin Model – Blended Normals (Code) float3 BlendNormals(float lightDiffusion, float vertexNdotL, float bumpNdotL, float3 lightPos) { // 값은 조정이 가능 float redIntensity = lerp(0.0f, 0.6f, skinDiffusionAmount); float greenBlueIntensity = lerp(0.0f, 0.4f, skinDiffusionAmount); float red = lerp(vertexNdotL, bumpNdotL, redIntensity); float greenBlue = lerp(vertexNdotL, bumpNdotL, greenBlueIntensity); greenBlue = min(red, greenBlue); // 필요없는 부분 제거 float3 result = float3(red, greenBlue.xx); return saturate(result); }

  19. New Skin Model – Blended Normals (Image)

  20. New Skin Model – Shadows • 확산 과정(라이트계산?)에서 그림자를 포함하지 않는 것에 대해 보상해야 함 • 2 Options: • 블러된그림자맵을레이어에 사용 • 그림자에 블러를 사용하면 비용이 있음 • 오브젝트당 한다면 안 좋음 • 선명한 그림자를 사용해서 블러 효과를 낸것처럼 애매하게 만들어서 사용함 (사기)

  21. New Skin Model - Shadows (cont.) • 선명한 그림자 • pow() 사용하여 선명한 그림자를 만듬 • Subdermal사용하지 않음 • Epidermal 작은값을사용(~2-4). • Diffuse 큰값을 사용(~8-16). • 상대적으로 그림자를 선명도를 조절 • Specular에그림자를 적용시 선명한 그림자를 사용해야 됨 • 그림자 영역에 반사되는 붉은색(피)영역이 보임

  22. New Skin Model - Shadows (cont.) • Blended Shadows. • 붉은(피) 표현의 그림자에 대해서 각 레이어의 그림자 선명도를 줄임 • blended normals을 사용 • 2개의 shadowpow.xy을 사용하여 계산 • 값을 미리 지정 • red 와green/blue 채널을 혼합 • 빨간색가장자리 색 • 가장자리일 경우 빨간색채도 감소 • subdermallayer (1–2). • epidermal layer (4–8). • diffuse ( 16–16). • 결과가 좋으면 무시할 수 있음

  23. New Skin Model – Shadows (Code) float3 BlendShadows(float2 shadowPow, float shadowMap) { float shadowR = pow(shadowMap, shadowPow.x); //subdermal float shadowGB = pow(shadowMap, shadowPow.y); // epidermal // Blend shadows float red = lerp(shadowGB, shadowR, skinDiffusionAmount); float greenBlue = lerp(shadowGB, shadowR, skinDiffusionAmount * 0.5); float3 result = float3( red, greenBlue.xx ); // 그림자를 빨간색으로 만들기 위해..채도를 감소 result = lerp(result, dot(result, float3(0.33, 0.59, 0.11)), 0.75); return saturate(result); }

  24. New Skin Model – Shadows (Image) Pure diffuse layer Pure epidermal/subdermal layers

  25. New Skin Model - Extras • Rim Lighting • fresnel(N·V) 계산 • rim term 계산 • Rim = smoothstep(0.0, 0.5, fresnel) * rimStrength; • 라이트계산뒤specular추가 • spec += rim * lightColor * pow(N·H, rimPower) * N·L * shadowMap; • Melanin(색소) • Diffuse 텍스쳐의luminance(휘도)를 계산 • lum = dot(diffuse, float3(0.33, 0.59, 0.11)); • diffuse 와 계산 • diffuse * lerp(1.0, diffuse*lum, melanin);

  26. New Skin Model – Notes • 선명한 그림자는 모든 레이어서 사용 할 필요가 없음 • 단순화된 그림자를 적용할 수 있음 • 피 표현에 대해 좋다 • 여러 번 blended normals수행 • 각 레이어 계산시 노말에 대한 강도를 조절하여 다향성을만듬 • Backscattering 색상은 제한 되지 않음 • Subdermal texture. • 반투명 램프

  27. 결과

  28. 결과 Standard NdotL + Blinn-phong (physical model) Skin Shading, no SSS Skin Shading, full SSS

  29. 결론 • Kelemen/Szirmay-Kalos BRDF 사용 • 텍스쳐를 구워 사용 beckmann, fresnel • 라이트가래핑된레이어에 산란 (subsurface scattering) • Epidermal, subdermal. • Keep wrapping at a minimum to avoid washing out the lighting. • 부드러운 노말을 사용 (blended normals ) • 그림자에 pow() 함수를 통해 선명도를 조절하여 피기가 도는 그림자를 만듬 • Backscattering 은 간단한 마스크 맵을 사용해서 N·L 계산 • 매우 저렴한 계산 • 추가 효과 적용 • rim lighting ,melanin

  30. 결론 • 장점 • 비용이 저렴하고 보기 좋음 • 다양한 분산효과(scattering effects) • (bleeding shadows, back lighting) • 여러 캐릭터에 적용할 수 있음 • 단점 • 확산 방법이 정확하지 않음 • 완전하지 않음

  31. Thanks for viewing!  • References: • Screen-Space Perceptual Rendering of Human Skin, Jorge Jimenez, Veronica Sundstedt, Diego Gutierrez, 2009 • http://giga.cps.unizar.es/~diegog/ficheros/pdf_papers/TAP_Jimenez_LR.pdf • Efficient Rendering of Human Skin, Eugene d'Eon, David Luebke, and Eric Enderton, Eurographics 2007 • http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html • Real-Time Approximations to Subsurface Scattering, Simon Green, 2004 • http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html • Uncharted 2: Character Lighting and Shading, John Hable, 2010 • http://advances.realtimerendering.com/s2010/Hable-Uncharted2(SIGGRAPH%202010%20Advanced%20RealTime%20Rendering%20Course).pptx • Crafting Physically Motivated Shading Models for Game Development, Naty Hoffman, 2010 • http://renderwonk.com/publications/s2010-shading-course/hoffman/s2010_physically_based_shading_hoffman_b.pdf • Real-Time Realistic Skin Translucency, Jorge Jimenez, David Whelan, Veronica Sundstedt, Diego Gutierrez, 2010 • http://giga.cps.unizar.es/~diegog/projects/IEEE/ieee.html

  32. Fin Head model available at Infinite-3D http://www.youtube.com/watch?v=AX9zQ5BdAvo

More Related