粗略的看了NVIDIA的Dawn Samples中的全局光照的算法描述,似乎是求出L*max(0,dot(N,l))的积分,按照N保存在一张Cube Map中,渲染的时候用法线索引出这个值再乘上vs中按照顶点的遮挡因子V插值得到的遮挡因子,最终得到最后的光照结果.
还不清楚顶点的遮挡因子是怎么求出来的,但是这样的近似似乎有个比较好的改进的地方.首先我们知道正确的应该是对L*V*max(0,dot(N,l))来求积分,而我们知道V对于光的入射角度来说一般不是常量,也就是不能移出积分公式,所以简单的乘上一个常量V(对于每个顶点来说)只是一个很不准确的近似结果.在这里我们可以通过SH来做一个比较好的近似计算,我们将L*max(0,dot(N,l))作为一个部分(这个部分就是NVIDIA的例子的相应部分),而V作为另外一个部分,用SH来分解这两个部分,第一个L*max(0,dot(N,l))部分得到的一组系数我们保存在一组贴图中(还是按照法线来索引),而顶点格式保存我们分解V得到的一组系数,通过插值传递到ps中和贴图中保存的第一部分系数做计算,这样我们得到的结果应该更加准确些.
还不清楚顶点的遮挡因子是怎么求出来的,但是这样的近似似乎有个比较好的改进的地方.首先我们知道正确的应该是对L*V*max(0,dot(N,l))来求积分,而我们知道V对于光的入射角度来说一般不是常量,也就是不能移出积分公式,所以简单的乘上一个常量V(对于每个顶点来说)只是一个很不准确的近似结果.在这里我们可以通过SH来做一个比较好的近似计算,我们将L*max(0,dot(N,l))作为一个部分(这个部分就是NVIDIA的例子的相应部分),而V作为另外一个部分,用SH来分解这两个部分,第一个L*max(0,dot(N,l))部分得到的一组系数我们保存在一组贴图中(还是按照法线来索引),而顶点格式保存我们分解V得到的一组系数,通过插值传递到ps中和贴图中保存的第一部分系数做计算,这样我们得到的结果应该更加准确些.

浙公网安备 33010602011771号