简单的shadow map需要两个pass,首先是lightview,然后是cameraview,在cameraview的时候要手工计算lightspace的z值,然后用它跟shadowmap里的值比,从而决定这个pixel是不是在影子里。如果想做softshadow,可以在cameraview的ps里多次采样,不过这里有个问题,可能你花大价钱采出来的值后来被遮挡住了,白算了,所以很多人使用了prez,当然也可以不用,不会有错误出现。

多个光的话就有点麻烦,可能你会努力只用一个cameraview pass——在cameraview中对所有的shadowmap进行采样,综合,然后再做其他的运算…如果是那样,我很欣赏你,但事实是我们很少那样做。我们需要把所有的shadowmap合并成一个cameraview的lightmap,在最终pass的时候关于shadow的部分只用这一个lightmap,我们还有很多其他的事情呢!那么,是不是只用一个pass就可以生成那个lightmap呢?答案是不一定,事实上我也在尝试,如果能放在一起就太好了,万一不能怎么办?其实我现在手里刚拿到的代码就是分开的,而且是,one pass for one light!!这种情况下没有prez是不能忍受的,不仅仅是效率上的问题,还有本质上的——不用的话会产生错误,可以想到我们在多个pass之间对framebuffer是用add来衔接的,所谓的dest + src… 这样问题就很明显了,对于那些被挡住的像素,我们本应该是totally replace的,现在变成add了,没有了prez,很难保证所有被挡住的像素都不会把自己发射的光传到camera里去,除非可以这样——如果z值相等就add,小于就replace,d3d可以这样么?别问我,我是初学者…

如果放在一个pass里就可以放心大胆地把blend关掉,有没有prez无所谓了,能不能实现呢?看我明天的造化吧T_T