比较好的参考文章, Unity Shader学习:贴花(Decal)
两个实现方式,Projector贴花、屏幕空间贴花 Projector贴花会有明显的卡的表现, 这里只是讲一下屏幕空间的贴花的思路。
屏幕空间的贴花里面的相当一部分代码能是很多功能的会用到的知识点:深度图重建世界坐标。 参考 Unity学习shader笔记[三十四]深度图采样和重建世界坐标的四种方式
之前这个部分已经被我玩得比较烂了。
大体的思路写一下吧。
贴花所在的物体是个半径为1的Unity内置正方体,渲染队列是透明。 渲染队列是透明 所以他能够拿到Unity提供的非透明物体渲染屏幕图,以及非透明物体渲染深度图。 如果他本身也是不透明队列,那么unity传入的深度图就包含了他自身,效果就不对了。
有了深度图之后,用上面的三十四的方式将深度图转换到世界坐标 转换到的是深度图同位置的像素的世界坐标
转换后再转换到内置正方体的模型空间坐标。 得到模型空间坐标,是会有超出正方体的部分的,用其x,y,z的绝对值是否大于0.5来判断,去除掉超出部分的片源。
对于半径为1的Unity内置正方体,模型空间坐标的xyz的范围是-0.5到0.5 然后忽略y值,只采用xz值,作为uv值,进行采样贴图。 因为uv的坐标范围是0到1,所以用xz采样uv需要-0.5到0.5 映射到 0到1的常规映射操作。 然后就可以采样了。</
|