CustomStencil shader在Engine/Content/BufferVisualization\CustomStencil
材质蓝图内容:
在场景中的效果如下:
- 需要r.customdepth=3 ,BufferVisualization选择CustomStencil。
- mesh需要设置:
分析材质:
材质最终效果由两部分差值获得,一个根据scenetexture(CustomStencil)计算颜色,另一个根据scenetexture(CustomStencil)现实显示数字。
计算颜色部分在本篇不分析。主要分析一下显示数字
ScreenPosition(ViewprotUV):屏幕UV输入
Stencil Text Tiling:frac(a.xy * 20) :将屏幕横排和竖排都划分20份。
UV的U:
- Text U Coord:((a.x - 0.25f) / 0.5f) * 3.f :将横坐标分成六份(在20份基础上划分)
- Unit Value:((int)trunc((a < 1.f) ? (b / 100) : ((a < 2.f) ? (b / 10) : b)) % 10) :横轴在不同位置,更加数值填写不同数值。该方式表示填写六份中的前三份。
- Letter U Coord: lerp(a / 64.f, (a + 1) / 64.f, b - trunc(b)) :差值采样对应图片上的数字。
- TextureSample:
- 图片:
- 图片Tiling方法:
UV的V:
- Letter V Coord :(a.y - 0.3) / (0.7 - 0.3):将采集的图片放在屏幕的0.3到0.7.(20份基础上)
这样就完成采样,数值的显示。
然后是数值显示和颜色进行差值
Text Box Mask:abs(a - 1.5) <= 1.5 && abs(b - 0.5) <= 0.5:U采用前三个,所以范围是0到3,V是0到1范围。为了计算速到,用公式方式abs表示。
应用
如果想表示四个字符,如下图,如何做呢?
改三个地方:
1.Unit Value:((int)trunc((a < 1.f) ? (b / 1000) : ((a < 2.f) ? (b / 100) : (a < 3.f) ? (b / 10) : b)) % 10):要多计算一位。
2.Text Box Mask:abs(a - 2) <= 2 && abs(b - 0.5) <= 0.5:U变成四个表示,范围成了0到4。
3.
Unit Value不能使用SceneTexture(CustomStencil),手动设置一个数值连上。理由是SceneTexture(CustomStencil)只能返回0-255.
为啥研究这个?
想修改SceneTexture(CustomStencil)返回值大于255.因为在输出Semantic Map时,如果Semantic的种类大于255,就无法展示。比如AirSim表示语义图,要小于255.
接下来研究如何修改SceneTexture(CustomStencil)