Original Post
I was fiddling around in FX Composer last night and came up with a pretty nice-looking fake sub-surface scattering effect, as follows: http://img131.imageshack.us/img131/1489/sss1je8.jpg http://img131.imageshack.us/img131/2131/sss2tt2.jpg http://img131.imageshack.us/img131/3440/sss3gu5.jpg http://img141.imageshack.us/img141/3603/sss4nu5.jpg I'll post my full algorithm/code when I get back from work later today. In a nutshell, I have a simple half-lambert base diffuse term, nothing special. The sub-surface scattering effect is divided up into three parts: 1) A dot product between the inverse surface normal and the light, clamped from 0 to 1, and finally distance attenuated; 2) Another half-lambert term between the inverse normal and view, also distance attenuated; 3) Scaling of subsurface color by red, green and blue extinction coefficients. The final shot demonstrates the effects of tweaking these to produce a blue scatter color. In addition, I have the 1 - N dot V squared rim lighting term put forth in the Dawn demo by nVidia (but this time scaled by the clamped dot product between light and normal, to avoid that weird backlighting) and a basic Blinn-Phong specular added on top. Since those pictures were taken I've done some basic work on extending my algorithm to account for colored lighting and non-uniform material thickness, although it doesn't look quite as nice as it does in those earlier screens. So, my questions are: 1) Anyone know of a good way to make this handle the non-uniform thickness more gracefully (I'll post some pictures later for review) 2) Any additonal suggestions for improving this to look more skin-like as a whole? Feedback of any sort is appreciated, though. I originally wrote this to replace some shaders in Oblivion and possibly even Doom 3, and as such lack the ability to use depth buffers, spherical harmonics or any of that stuff, unless any and all information can be passed in through textures and shader constants ONLY. This is also targeted at SM3.0, although it works just fine in SM2.0 and the OpenGL equivalents (this has been ported to ARB assembly without incident)