Cheap realisticskinshading kor

1,883 views

Published on

shader study

Published in: Health & Medicine, Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,883
On SlideShare
0
From Embeds
0
Number of Embeds
512
Actions
Shares
0
Downloads
20
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
  • 계산 비용이 적고 리얼한 피부 쉐이딩
  • 여기에 있는 문서 및 논문을 바탕으로 설계
  • Weigh 무게
  • Cheap realisticskinshading kor

    1. 1. Cheap Realistic Skin Shading
    2. 2. Overview • 일반적인 Skin Models • New Skin Model – Ideas – BRDF – Layers – Back Scattering – Blended Normals – Shadows – Extras • 결과 • 결론
    3. 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. 4. 일반적인 Skin Models • 가장 현실적으로 표현할 수 있는 기술들이 인기가 있음 • 각 모델에는 장,단점이 있음 – 계산 비용은 매우 저렴하지만 조잡함 – 계산 비용이 크면 퀄리티가 우수함 • 어느정도 완성된(꾸며진) 조명에서는 잘 되지만 날카로운 조명에서는 안좋음 • 그 중간의 대안이 필요함 – 저렴하고 퀄리티가 좋아야 함
    5. 5. New Skin Model • 물리적계산 없음 • 정확한 계산은 않하지만 보기에 좋음 • 다른 기술들을의 핵심 개념을 사용함 • Fast-Skin Shader, Human Skin Shader… – 멀티 레이어 사용 – 물리적 기반 BRDF. – 일반적으로 표현해야 할 것 • 그림자 가장자리의 붉은 표현 • 부드러운 표현 • 거친 표현 낮추기
    6. 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. 7. New Skin Model - BRDF • Kelemen/Szirmay-Kalos BRDF 최적화 – fresnel to texture 저장 • 왜 하나의 specular term을 사용? – beckmann texture 4개의 채널을 가질 수 있음 – 쉐이더에서 계산대신 4개의 float값을 사용 – Weigh them은 간단한 dot product 사용하여 구함
    8. 8. New Skin Model – BRDF (Code) 미리 계산하여 텍스쳐를 뽑음 정밀하게 계산할 필요가 없음// 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 ); } Code modified from NVIDIA’s implementation.
    9. 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. 10. New Skin Model – BRDF (Result)
    11. 11. New Skin Model - Layers • 멀티 레이어를 만듬 – 레이어 마다 새로운 텍스쳐 생성 – 실제 해상도 보다 텍스쳐가 작으면 비용이 저렴함 – 라이트 레이어 • 블러된 상태에서 라이트를 계산 • Diffuse는 않함 • ~0.8 – 0.9 for epidermal. • ~0.7 – 0.8 for subdermal. – 각 텍스쳐에 조명을 적용함 Epidermal = 0.3, Subdermal = 0.2, Diffuse = 0.5
    12. 12. New Skin Model – Layers (Textures) Diffuse Epidermal Subdermal Back Scattering Specular Normal
    13. 13. New Skin Model – Layers (Image)
    14. 14. New Skin Model – Back Scattering • 매우 간단함 – N·L과 간단한 계산 • 반투명 텍스쳐에 마스크 채널사용 – Subdermal(진피) map 알파채널 사용 – 버텍스 칼라값을 사용할수도 있음 • 날카로운 그림자를 사용안함 – 소프트 그림자를 사용하여 산란(backscattering)효과 – Translucent shadow maps. – 그림자 영역이 재대로 가려지지 않을 수 있음 • 아직 기술이 불완전함
    15. 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. 16. New Skin Model – Back Scattering (Image)
    17. 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. 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. 19. New Skin Model – Blended Normals (Image)
    20. 20. New Skin Model – Shadows • 확산 과정(라이트계산?)에서 그림자를 포함하지 않는 것에 대해 보상해야 함 • 2 Options: – 블러된 그림자맵을 레이어에 사용 • 그림자에 블러를 사용하면 비용이 있음 • 오브젝트당 한다면 안 좋음
    21. 21. New Skin Model - Shadows (cont.) • 선명한 그림자 – pow() 사용하여 선명한 그림자를 만듬 – Subdermal 사용하지 않음 – Epidermal 작은값을 사용 (~2-4). – Diffuse 큰값을 사용 (~8-16). – 상대적으로 그림자를 선명도를 조절 • 그림자 영역에 반사되는 붉은색(피)영역이 보임
    22. 22. New Skin Model - Shadows (cont.) • Blended Shadows. – 붉은(피) 표현의 그림자에 대해서 각 레이어의 그림자 선명도를 줄임 • 2개의 shadowpow.xy을 사용하여 계산 • 값을 미리 지정 • red 와 green/blue 채널을 혼합 – 빨간색 가장자리 색 – 가장자리일 경우 빨간색 채도 감소 • subdermal layer ( – ). • epidermal layer ( – ). • diffuse ( – ). • 결과가 좋으면 무시할 수 있음
    23. 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. 24. New Skin Model – Shadows (Image) Pure diffuse layer Pure epidermal/subdermal layers
    25. 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. 26. New Skin Model – Notes • 선명한 그림자는 모든 레이어서 사용 할 필요가 없음 – 단순화된 그림자를 적용할 수 있음 – 피 표현에 대해 좋다 • 여러 번 blended normals 수행 – 각 레이어 계산시 노말에 대한 강도를 조절하여 다향성을 만듬 • Backscattering 색상은 제한 되지 않음 – Subdermal texture. – 반투명 램프
    27. 27. 결과
    28. 28. 결과 Standard NdotL + Blinn-phong (physical model) Skin Shading, no SSS Skin Shading, full SSS
    29. 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. 30. 결론 • 비용이 저렴하고 보기 좋음 • 다양한 분산효과(scattering effects) • (bleeding shadows, back lighting) • 여러 캐릭터에 적용할 수 있음 • 확산 방법이 정확하지 않음 • 완전하지 않음
    31. 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. 32. FinHead model available at Infinite-3D http://www.youtube.com/watch?v=AX9zQ5BdAvo

    ×