1. 选中物体并进行高亮表示是很多游戏的基本功能
这里主要有几种做法:
第一种是直接在单个物体使用的material里面进行调整加上一层fresnel表面emissive.
这种方法的好处就是:
a. 可单独定制每个物体的高亮颜色
b. 材质做起来很简单
缺点就是:
每个物体都要单独进行材质修改很费力
第二种是在postprocess volume里直接加一个postvolume material,后期合成效果
好处是,一个材质全家能用
坏处是,这个材质做起来稍微复杂点,但也没多么复杂
第三种是之前看youtube一个印度小哥(抱歉听口音感觉是)用的是twosided sign, 只渲染内侧,然后通过normal方向上进行offset把整个表面进行上色位移,之后再把这个物体duplicate一个,重叠表示高亮。
这里问题就是很明显了, 多边形增多了,实在没啥用.
第一种方法的material很好做 也不用多说了.
需要提到的一点是为了增大contrast(因为fresnel算的是渐变的,所以用一个if句子进行分类即可)
这种方法不用使用custom depth pass 和stencil
第二种是 需要用到custom depth pass 和stencil的
需要提到的一点是custom depth pass 其实就是新增了一个layer,除了某些物体被标记为在这个pass里,其他的物体全部在custom depth pass 是极大值的,这里就是为了区分和标记为在这个pass里的物体.
然后scene depth其实就是从摄像机到物体的距离. 对于标记在pass里的物体而言,它的custom depth 和scenedepth是一样的.
还有以一件事是:
stencil的启用是需要到project setting里面启用的.
默认是0
第二种的材质截图
Screenposition: 输出的其实就是R,G channel从左上(0,0)到右下(1,1)
Scenetexelsize实际就是整个viewport的scenetexture的每个颜色方格的尺寸
其实整个过程的思路还是很简单的, 就一个像素点的左上和右下两个位置的stencil进行对比,检测出边,是边的话就高亮显示,其他不是的就用postprocessinput0(这个node返回的就是某UV(即是屏幕空间x,y坐标)下的像素颜色值)
实际上这里是简化了的做法还有一位印度小哥(抱歉又是印度小哥)
把4个方位检测的也做了一下虽然道理是一样的.
但是写上去之后代码量激增
Blursampleoffest实际就是屏幕空间的UV的几个方向而已,这里用的就是上下左右几个方向的而已,当然你也可以自己写,但是就是麻烦
Bitmask实际上就是在比较mask和bitmask是不是一样大,一样大就输出1否则就是0,老简单了,但是要注意用之前要把bitmask的数字除个255,因为你看函数里面Bit也除了....
lineargradien实际就是产生UV的像素级别smooththing而已
顶点是有UV坐标的但是光栅化之后中间的像素的UV需要平滑插值计算的,这个时候用这个node就完事
总的来讲
高亮就是要做好edge检测就ok了
没啥难的.