• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Cheap realisticskinshading kor

on

  • 1,307 views

shader study

shader study

Statistics

Views

Total Views
1,307
Views on SlideShare
808
Embed Views
499

Actions

Likes
0
Downloads
10
Comments
0

2 Embeds 499

http://aniz.tistory.com 498
http://translate.googleusercontent.com 1

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 계산 비용이 적고 리얼한 피부 쉐이딩
  • 여기에 있는 문서 및 논문을 바탕으로 설계

Cheap realisticskinshading kor Cheap realisticskinshading kor Presentation Transcript

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