结合照明效果(特别是SSS)

时间:2015-11-03 23:02:30

标签: opengl glsl lighting shadow-mapping

我正在研究渲染程序,我需要将几种效果结合在一起。我有阴影贴图,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;

0 个答案:

没有答案