Transcript
Page 1: Cheap Realistic Skin Shading

Cheap Realistic Skin ShadingStephen Clement

Page 2: Cheap Realistic Skin Shading

Overview• 일반적인 Skin Models• New Skin Model

– Ideas– BRDF– Layers– Back Scattering– Blended Normals– Shadows– Extras

• 결과• 결론

Page 3: Cheap Realistic Skin Shading

일반적인 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

Page 4: Cheap Realistic Skin Shading

일반적인 Skin Models

• 가장 현실적으로 표현할 수 있는 기술들이 인기가 있음

• 각 모델에는 장 , 단점이 있음– 계산 비용은 매우 저렴하지만 조잡함– 계산 비용이 크면 퀄리티가 우수함

• 어느정도 완성된 ( 꾸며진 ) 조명에서는 잘 되지만 날카로운 조명에서는 안좋음

• 그 중간의 대안이 필요함– 저렴하고 퀄리티가 좋아야 함

Page 5: Cheap Realistic Skin Shading

New Skin Model

• 물리적계산 없음• 정확한 계산은 않하지만 보기에 좋음

• 다른 기술들을의 핵심 개념을 사용함• Fast-Skin Shader, Human Skin Shader…– 멀티 레이어 사용– 물리적 기반 BRDF.– 일반적으로 표현해야 할 것

• 그림자 가장자리의 붉은 표현• 부드러운 표현• 거친 표현 낮추기

Page 6: Cheap Realistic Skin Shading

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 을 사용

Page 7: Cheap Realistic Skin Shading

New Skin Model - BRDF

• Kelemen/Szirmay-Kalos BRDF 최적화– beckmann distribution to texture 저장– fresnel to texture 저장

• 왜 하나의 specular term 을 사용 ?– beckmann texture 4 개의 채널을 가질 수 있음– 쉐이더에서 계산대신 4 개의 float 값을 사용– Weigh them 은 간단한 dot product 사용하여 구함– 추가 비용이 높지 않고 다양한 specularities 를 얻음

– 여러부분에서 재사용할 수 있음

Page 8: Cheap Realistic Skin Shading

New Skin Model – BRDF (Code)미리 계산하여 텍스쳐를 뽑음정밀하게 계산할 필요가 없음// 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 );

}

Code modified from NVIDIA’s implementation.

Page 9: Cheap Realistic Skin Shading

New Skin Model – BRDF (Code)float KelemenSzirmayTex( float3 N, float3 L, float3 V, float Exp, float F0 ){

// Pretty straightforwardfloat 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 F0float fFresnel = tex2D(fresnelTex, float2(HdotV, F0));// float fFresnel = GetFresnelKS(HdotV, F0 ); // Math version.

// Get beckmann distributions from texturefloat4 fBeckmann = pow(2.0 * tex2D(beckmannSampler, float2(NdotH, Exp)), 10); float4 fSpec = max( (fBeckmann * fFresnel) / dot( h, h ), 0 );

// Weight results using dot productfloat result = saturate( NdotL ) * dot(fSpec, half4(1.0, 0.625, 0.075, 0.005));

return result;}

Page 10: Cheap Realistic Skin Shading

New Skin Model – BRDF (Result)

Page 11: Cheap Realistic Skin Shading

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

Page 12: Cheap Realistic Skin Shading

New Skin Model – Layers (Textures)

Diffuse Epidermal Subdermal

Back Scattering Specular Normal

Page 13: Cheap Realistic Skin Shading

New Skin Model – Layers (Image)

Page 14: Cheap Realistic Skin Shading

New Skin Model – Back Scattering

• 매우 간단함– N·L 과 간단한 계산

• 반투명 텍스쳐에 마스크 채널사용– Subdermal( 진피 ) map 알파채널 사용– 버텍스 칼라값을 사용할수도 있음

• 날카로운 그림자를 사용안함– 소프트 그림자를 사용하여 산란 (backscattering) 효과

• 다른 방법을 사용할수도 있음– Translucent shadow maps.

• 문제 :– 그림자 영역이 재대로 가려지지 않을 수 있음

• 아직 기술이 불완전함

Page 15: Cheap Realistic Skin Shading

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;}

Page 16: Cheap Realistic Skin Shading

New Skin Model – Back Scattering (Image)

Page 17: Cheap Realistic Skin Shading

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

Page 18: Cheap Realistic Skin Shading

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);

}

Page 19: Cheap Realistic Skin Shading

New Skin Model – Blended Normals (Image)

Page 20: Cheap Realistic Skin Shading

New Skin Model – Shadows

• 확산 과정 ( 라이트계산 ?) 에서 그림자를 포함하지 않는 것에 대해 보상해야 함

• 2 Options:– 블러된 그림자맵을 레이어에 사용

• 그림자에 블러를 사용하면 비용이 있음• 오브젝트당 한다면 안 좋음

• 선명한 그림자를 사용해서 블러 효과를 낸것 처럼 애매하게 만들어서 사용함 ( 사기 )

Page 21: Cheap Realistic Skin Shading

New Skin Model - Shadows (cont.)• 선명한 그림자

– pow() 사용하여 선명한 그림자를 만듬– Subdermal 사용하지 않음– Epidermal 작은값을 사용 (~2-4).– Diffuse 큰값을 사용 (~8-16).

– 상대적으로 그림자를 선명도를 조절– Specular 에 그림자를 적용시 선명한 그림자를

사용해야 됨• 그림자 영역에 반사되는 붉은색 ( 피 ) 영역이 보임

Page 22: Cheap Realistic Skin Shading

New Skin Model - Shadows (cont.)• Blended Shadows.

– 붉은 ( 피 ) 표현의 그림자에 대해서 각 레이어의 그림자 선명도를 줄임

– blended normals 을 사용• 2 개의 shadowpow.xy 을 사용하여 계산

• 값을 미리 지정• red 와 green/blue 채널을 혼합

– 빨간색 가장자리 색– 가장자리일 경우 빨간색 채도 감소

• subdermal layer (1 – 2).• epidermal layer (4 – 8).• diffuse ( 16 – 16).

• 결과가 좋으면 무시할 수 있음

Page 23: Cheap Realistic Skin Shading

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);}

Page 24: Cheap Realistic Skin Shading

New Skin Model – Shadows (Image)

Pure diffuse layer Pure epidermal/subdermal layers

Page 25: Cheap Realistic Skin Shading

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);

Page 26: Cheap Realistic Skin Shading

New Skin Model – Notes

• 선명한 그림자는 모든 레이어서 사용 할 필요가 없음– 단순화된 그림자를 적용할 수 있음– 피 표현에 대해 좋다

• 여러 번 blended normals 수행– 각 레이어 계산시 노말에 대한 강도를 조절하여 다향성을 만듬

• Backscattering 색상은 제한 되지 않음– Subdermal texture.

– 반투명 램프

Page 27: Cheap Realistic Skin Shading

결과

Page 28: Cheap Realistic Skin Shading

결과

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

Page 29: Cheap Realistic Skin Shading

결론• 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

Page 30: Cheap Realistic Skin Shading

결론

• 장점• 비용이 저렴하고 보기 좋음• 다양한 분산효과 (scattering effects)

• (bleeding shadows, back lighting)• 여러 캐릭터에 적용할 수 있음

• 단점• 확산 방법이 정확하지 않음• 완전하지 않음

Page 31: Cheap Realistic Skin Shading

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%20R

ealTime%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

Page 32: Cheap Realistic Skin Shading

FinHead model available at Infinite-3D

http://www.youtube.com/watch?v=AX9zQ5BdAvo


Top Related