News
- August 18, 2011Screen-space skin rendering is being used in Unreal Engine 3 and Unigine! More in The Technology Behind the DirectX 11 Unreal Engine and in the Unigine Dev Blog.
- March 29, 2011Screen-space skin rendering is one of the key features of CryEngine 3. More in Crysis 2 Key Rendering Features.
- February 22, 2011Confetti RawK engine has a screen-space skin rendering solution! More in the Wolfgang Engel blog.
- February 11, 2011Slides are now available for download.
- April 23, 2010Web launched!
Abstract
We propose a novel skin shader which translates the simulation of subsurface scattering from texture space to a screen-space diffusion approximation. It naturally scales well while maintaining a perceptually plausible result. This technique allows us to ensure real-time performance even when several characters may appear on screen at the same time. The visual realism of the resulting images is validated using a subjective psychophysical preference experiment. Our results show that, independent of distance and light position, the images rendered using our novel shader have as high visual realism as a previously developed physically-based shader.
A very efficient implementation is described in the first book of the GPU Pro series. Buy the book!
Downloads
1 Please note that the GPU Pro chapter contains more low-level details on the implementation, including gaussian removal depending on distance and a very efficient alpha blending pipeline. We encorage you to buy the book for getting all the details.
Shader
float4 BlurPS(PassV2P input, uniform float2 step) : SV_TARGET {
// Gaussian weights for the six samples around the current pixel:
// -3 -2 -1 +1 +2 +3
float w[6] = { 0.006, 0.061, 0.242, 0.242, 0.061, 0.006 };
float o[6] = { -1.0, -0.6667, -0.3333, 0.3333, 0.6667, 1.0 };
// Fetch color and linear depth for current pixel:
float4 colorM = colorTex.Sample(PointSampler, input.texcoord);
float depthM = depthTex.Sample(PointSampler, input.texcoord);
// Accumulate center sample, multiplying it with its gaussian weight:
float4 colorBlurred = colorM;
colorBlurred.rgb *= 0.382;
// Calculate the step that we will use to fetch the surrounding pixels,
// where "step" is:
// step = sssStrength * gaussianWidth * pixelSize * dir
// The closer the pixel, the stronger the effect needs to be, hence
// the factor 1.0 / depthM.
float2 finalStep = colorM.a * step / depthM;
// Accumulate the other samples:
[unroll]
for (int i = 0; i < 6; i++) {
// Fetch color and depth for current sample:
float2 offset = input.texcoord + o[i] * finalStep;
float3 color = colorTex.SampleLevel(LinearSampler, offset, 0).rgb;
float depth = depthTex.SampleLevel(PointSampler, offset, 0);
// If the difference in depth is huge, we lerp color back to "colorM":
float s = min(0.0125 * correction * abs(depthM - depth), 1.0);
color = lerp(color, colorM.rgb, s);
// Accumulate:
colorBlurred.rgb += w[i] * color;
}
// The result will be alpha blended with current buffer by using specific
// RGB weights. For more details, I refer you to the GPU Pro chapter :)
return colorBlurred;
}
Bibtex
@article{JIMENEZ2009_TAP,
author = {Jorge Jimenez and Veronica Sundstedt and Diego Gutierrez},
title = {Screen-space perceptual rendering of human skin},
journal = {ACM Transactions on Applied Perception},
volume = {6},
number = {4},
year = {2009},
pages = {23:1--23:15},
}
@inbook{JIMENEZ2010_GPUPRO,
author = {Jorge Jimenez and Diego Gutierrez},
editor = {Wolfgang Engel},
title = {GPU Pro: Advanced Rendering Techniques},
chapter = {Screen-Space Subsurface Scattering},
publisher = {{AK} Peters Ltd.},
year = {2010},
pages = {335--351},
}
@article{JIMENEZ2010_IEEE,
author = {Jorge Jimenez and David Whelan and Veronica Sundstedt and Diego Gutierrez},
title = {Real-Time Realistic Skin Translucency},
journal = {IEEE Computer Graphics and Applications},
volume = {30},
number = {4},
year = {2010},
pages = {32--41},
}
@article{JIMENEZ2010_TOG,
author = {Jorge Jimenez and Timothy Scully and Nuno Barbosa and Craig Donner and Xenxo Alvarez and
Teresa Vieira and Paul Matts and Verónica Orvalho and Diego Gutierrez and Tim Weyrich},
title = {A practical appearance model for dynamic facial color},
journal = {ACM Transactions on Graphics (Proc. SIGGRAPH Asia)},
year = {2010},
volume = {29},
number = {6},
pages = {141:1--141:10},
}
@inbook{JIMENEZ2011_GPUPRO2B,
author = {Jorge Jimenez and Jose I. Echevarria and Christopher Oat and Diego Gutierrez},
editor = {Wolfgang Engel},
title = {{GPU} Pro 2},
chapter = {Practical and Realistic Facial Wrinkles Animation},
publisher = {{AK} Peters Ltd.},
year = {2011},
}@article{JIMENEZ2015_CGF,
author = {Jorge Jimenez and Károly Zsolnai and Adrian Jarabo and Christian Freude and Thomas Auzinger and
Xian-Chun Wu and Javier von der Pahlen and Michael Wimmer and Diego Gutierrez},
title = {Separable Subsurface Scattering},
journal = {Computer Graphics Forum},
year = {2015},
}
Related
- 2010: Real-Time Realistic Skin Translucency
- 2010: A Practical Appearance Model for Dynamic Facial Color
- 2011: Practical and Realistic Facial Wrinkles Animation
- 2015: Separable Subsurface Scattering
Links
- March 10, 2010: Piel virtual que acaricia al espectador (Heraldo de Aragón), in Spanish
- March 10, 2010: Hollywood se fija en la Universidad de Zaragoza (Heraldo de Aragón), in Spanish


