cheap realistic skin shading

32
Cheap Realistic Skin Shading Stephen Clement

Upload: chaim-freeman

Post on 03-Jan-2016

98 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

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