在mmo项目开发过程中,不可避免的要实现描边与遮挡效果。
把这2个放在一起说,是因为实现的方式相同(不是shader相同)。
在一开始实现的过程中,描边就是直接写一个描边的shader来做。人物被选中的时候,就把人物的材质换掉,换成描边shader,鼠标移开时候,在还原之前的shader。这样是可以实现描边。unity中,表现各种渲染效果都是通过换材质来实现的。但是项目中难免出现各种材质,精英怪与普通怪的表现不一样,难道就要为了一个描边写出每个材质对应的描边材质?这样对项目日后的管理增加了难度,以后每写一个新的人物shader,都要对应的写一个描边效果。有没有一劳永逸的方法呢。把描边和换材质分开?
再看被遮挡效果。策划那边是想实现火炬之光那样的遮挡效果,怎么实现呢。人物mesh绘制两遍,第一遍ZTest 为 Greater, ZWrite off,第二遍正常绘制即可。如果人物是一个mesh就还好说,2个shader中2 个 pass就能实现。但是如果是多个mesh拼接的人物,2个pass就出出现问题。
最后使用多个camera来绘制,解决了这个问题。
实现如下:
每个camera实际上都和场景中的main camera一样(位置,旋转,各个参数)。只是他们各自的cullmask不一样。也就是绘制的东西不一样。
最开始,我先使用第一个camera 渲染场景(建筑),第二个相机渲染需要被遮挡效果的人物,第三个相机渲染人物描边效果,第四个相机正常渲染人物。是可以正常实现想要的结果,但是人物和场景分开相机渲染会造成场景中看不到人物的阴影。
所以最后只能把人物和场景放在一起渲染。
首先,maincamera绘制全部场景,人物。然后第二个camera绘制描边的人物,第三个camera清空场景的深度信息,然后使用Camera.RenderwithShader()绘制遮挡物的深度信息(遮挡物可以让美术在场景中标记,使用layer来标记),第四个camera绘制需要实现被遮挡效果的人物,一样使用Camera.RenderwithShader()。