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

第二种的材质截图

 

 

OGRE高亮物体 高亮物品显示_高亮

 

 

 Screenposition: 输出的其实就是R,G channel从左上(0,0)到右下(1,1)

Scenetexelsize实际就是整个viewport的scenetexture的每个颜色方格的尺寸

其实整个过程的思路还是很简单的, 就一个像素点的左上和右下两个位置的stencil进行对比,检测出边,是边的话就高亮显示,其他不是的就用postprocessinput0(这个node返回的就是某UV(即是屏幕空间x,y坐标)下的像素颜色值)

实际上这里是简化了的做法还有一位印度小哥(抱歉又是印度小哥)

把4个方位检测的也做了一下虽然道理是一样的.

但是写上去之后代码量激增

OGRE高亮物体 高亮物品显示_高亮_02

 

 Blursampleoffest实际就是屏幕空间的UV的几个方向而已,这里用的就是上下左右几个方向的而已,当然你也可以自己写,但是就是麻烦

Bitmask实际上就是在比较mask和bitmask是不是一样大,一样大就输出1否则就是0,老简单了,但是要注意用之前要把bitmask的数字除个255,因为你看函数里面Bit也除了....

lineargradien实际就是产生UV的像素级别smooththing而已

顶点是有UV坐标的但是光栅化之后中间的像素的UV需要平滑插值计算的,这个时候用这个node就完事

总的来讲

高亮就是要做好edge检测就ok了

没啥难的.