32
Cheap Realistic Skin Shading

Cheap realisticskinshading kor

  • Upload
    -

  • View
    1.937

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Cheap realisticskinshading kor

Cheap Realistic Skin Shading

Page 2: Cheap realisticskinshading kor

Overview• 일반적인 Skin Models

• New Skin Model

– Ideas

– BRDF

– Layers

– Back Scattering

– Blended Normals

– Shadows

– Extras

• 결과

• 결론

Page 3: Cheap realisticskinshading kor

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

일반적인 Skin Models

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

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

– 계산비용이크면퀄리티가우수함• 어느정도완성된(꾸며진)조명에서는잘되지만날카로운조명에서는안좋음

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

Page 5: Cheap realisticskinshading kor

New Skin Model

• 물리적계산없음

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

• 다른기술들을의핵심개념을 사용함

• Fast-Skin Shader, Human Skin Shader…– 멀티레이어사용

– 물리적기반 BRDF.

– 일반적으로표현해야할것

• 그림자가장자리의붉은표현

• 부드러운표현

• 거친표현낮추기

Page 6: Cheap realisticskinshading kor

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 realisticskinshading kor

New Skin Model - BRDF

• Kelemen/Szirmay-Kalos BRDF 최적화

– fresnel to texture 저장

• 왜하나의 specular term을사용?– beckmann texture 4개의채널을가질수있음

– 쉐이더에서계산대신 4개의 float값을사용

– Weigh them은 간단한 dot product 사용하여구함

Page 8: Cheap realisticskinshading kor

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 weightsfloat4 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 realisticskinshading kor

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;

}

Page 10: Cheap realisticskinshading kor

New Skin Model – BRDF (Result)

Page 11: Cheap realisticskinshading kor

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

Page 12: Cheap realisticskinshading kor

New Skin Model – Layers (Textures)

Diffuse Epidermal Subdermal

Back Scattering Specular Normal

Page 13: Cheap realisticskinshading kor

New Skin Model – Layers (Image)

Page 14: Cheap realisticskinshading kor

New Skin Model – Back Scattering

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

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

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

– Translucent shadow maps.

– 그림자영역이재대로가려지지않을수있음• 아직기술이불완전함

Page 15: Cheap realisticskinshading kor

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 realisticskinshading kor

New Skin Model – Back Scattering (Image)

Page 17: Cheap realisticskinshading kor

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 realisticskinshading kor

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 realisticskinshading kor

New Skin Model – Blended Normals (Image)

Page 20: Cheap realisticskinshading kor

New Skin Model – Shadows

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

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

• 그림자에블러를사용하면비용이있음

• 오브젝트당한다면안좋음

Page 21: Cheap realisticskinshading kor

New Skin Model - Shadows (cont.)

• 선명한그림자

– pow() 사용하여선명한그림자를만듬

– Subdermal 사용하지않음

– Epidermal 작은값을사용 (~2-4).

– Diffuse 큰값을사용 (~8-16).

–상대적으로그림자를선명도를조절

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

Page 22: Cheap realisticskinshading kor

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

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

• 2개의 shadowpow.xy을사용하여계산• 값을미리지정

• red 와 green/blue 채널을혼합– 빨간색가장자리색– 가장자리일경우빨간색채도감소

• subdermal layer ( – ).• epidermal layer ( – ).• diffuse ( – ).

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

Page 23: Cheap realisticskinshading kor

New Skin Model – Shadows (Code)float3 BlendShadows(float2 shadowPow, float shadowMap){

float shadowR = pow(shadowMap, shadowPow.x); // subdermalfloat shadowGB = pow(shadowMap, shadowPow.y); // epidermal

// Blend shadowsfloat 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 realisticskinshading kor

New Skin Model – Shadows (Image)

Pure diffuse layer Pure epidermal/subdermal layers

Page 25: Cheap realisticskinshading kor

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 realisticskinshading kor

New Skin Model – Notes

• 선명한그림자는모든레이어서사용할필요가없음

– 단순화된그림자를적용할수있음

– 피표현에대해좋다

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

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

– 반투명램프

Page 27: Cheap realisticskinshading kor

결과

Page 28: Cheap realisticskinshading kor

결과

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

Page 29: Cheap realisticskinshading kor

결론

• 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 realisticskinshading kor

결론

• 비용이저렴하고보기좋음

• 다양한분산효과(scattering effects)

• (bleeding shadows, back lighting)

• 여러캐릭터에적용할수있음

• 확산방법이정확하지않음

• 완전하지않음

Page 31: Cheap realisticskinshading kor

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

Page 32: Cheap realisticskinshading kor

FinHead model available at Infinite-3D

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