我正在研究渲染程序,我需要将几种效果结合在一起。我有阴影贴图,SSS和环绕照明,如下所述:http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html
如何结合这些效果?当计算阴影时,我得到一个浮点[0,1]乘以整体颜色,而SSS计算我得到一个浮点[0,1]描述了光穿过物体的距离。我不能将它们相乘,因为那时背面仍将处于阴影中。我对混合许多灯光效果感到困惑。
我正在进行典型的VSM阴影贴图,其中从每个灯光渲染深度贴图,然后从相机渲染最后一个。在此过程中,我使用VSM和SSS组件使用相同的深度图(exp( - (d_o - d_i)* sigma_t))计算阴影分量。 (下面代码的主体每个灯发生一次因此索引)
shadow = shadowsVar[i];
NdotL = dot(n,normalize(lightDir[i]));
spotEffect = dot(normalize(gl_LightSource[i].spotDirection), normalize(-lightDir[i]));
if (spotEffect > spotOff[i])
{
spotEffect = smoothstep(spotOff[i], 1.0, spotEffect);
spotEffect *= shadow;
// this is where im trying to incorporate my sss component
#ifdef SUBSURFACE_SCATTERING
spotEffect *= sss_comp;
#endif // SUBSURFACE_SCATTERING
att = spotEffect;
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[i].diffuse * NdotL;
final_color += att * diffuse;
halfV = normalize(gl_LightSource[i].halfVector).xyz;
NdotHV = max(dot(n,halfV),0.0);
specular_color += att * gl_FrontMaterial.specular * gl_LightSource[i].specular * pow(NdotHV,gl_FrontMaterial.shininess);
}
#ifdef USE_TEXTURE
final_color.rgb *= texture2D(colorTexture,gl_TexCoord[0].st).rgb;
#endif // USE_TEXTURE
final_color.rgb += specular_color.rgb;
gl_FragColor = final_color;