ZBuffer裁剪planar shadow

适当的操作ZBuffer可以巧妙的完成一些任务,比如我要在擂台的边缘裁剪人的影子。擂台的特点是边缘之外的地方比较低。将影子埋在擂台表面下一点点, 先绘制擂台,然后改变z test func,改为greater,并关闭z write,然后绘制影子,因为影子是在擂台下面的,这样从擂台上方看,影子具有比擂台表面更大的z值,opengl中z值大意味着离camera远,按 照正常的z测试方法,GL_LESS或GL_LEQUAL通过测试,这样影子应该画不出来,而如果将z test func设为GL_GREATER,离camera远的影子反而绘制在擂台表面上了。而在擂台的边缘,因为擂台外的像素会比影子更低,影子的z会比较小, 不能通过GL_GREATER的测试,这样擂台边缘外的影子片段就不能绘制了,也就达到了裁剪的目的。同时由于绘制影子时关闭了z write,影子的z值不会被写入,也就意味着影子之后绘制的东西能挡住影子,比如人总能踩住影子。之后恢复正常的z test并打开z write,绘制人和其他物体。
当然这个方法也并不完美,比如镜头前的物体会挡住影子,影子会浮在擂台后比较高的物体上,比如墙。我的影子是简单的平面阴影,设备没有模板缓冲,这么做似乎已经是可以达到的最好结果了。

你可能感兴趣的:(buffer)