在Unity着色器开发这个范畴内,Object节点是Shader Graph里的一种工具,它的作用是获取当前进行渲染之时对象的基础属性,并且此节点在这个过程里属于核心工具。它能够直接给着色器提供对象的世界空间位置以及缩放方面的信息,它还是能够实现位置关联光照、动态纹理平铺或者对象变换动画这样子的视觉效果的关键入口,然而它的行为会因为渲染管线比如说URP与HDRP的不一样而产生差异。
Position端口会输出当下正在进行渲染的对象于世界空间里的坐标,也就是相对于Unity场景的原点(0,0,0)所处于的位置,这个数据属于三维向量,它涵盖了对象在X轴、Y轴以及Z轴上的具体数值。
缩放端口输出的对象,于世界空间里的缩放数值,这它也是个三维向量,它代表了对象在三个轴向上被拉伸或者压缩的程度,该数值考虑了对象层级结构里所有父级对象的累积缩放效果。
于底层实现里,Position端口借由内置着色器变量来获取数据,在URP当中,它借助SHADERGRAPH_OBJECT_POSITION宏从模型矩阵提取位置信息,此矩阵承担着把顶点从对象空间转换至世界空间的职责。
Scale端口的达成会更繁杂,得从模型矩阵中把旋转以及位置的影响给剥离掉。借助计算矩阵每个轴所对应的向量的长度来获取精准的缩放数值,这样的办法确保了就算对象出现旋转,也能够精确地提取出其实际的缩放比例。
开发者能够借助Position输出去制作随位置变动的材质效果。比如说,把对象Y轴高度值跟Split节点相连,经过Remap节点映射之后当作混合因子,达成从低海拔到高海拔,由草地逐步过渡到雪地的视觉效果。
在Scale端口的帮助之下,能够搭建出自适应纹理平铺系统,把缩放数值跟自定义平铺参数相乘之后,输入到纹理节点的平铺接口内,以此保证大型物体以及小型物体的表面都能够维持一样的纹理密度,防止纹理延伸或者过度重复。
拥有具备调试功能的Object节点 ,把Position输出直接转变成颜色值 ,这能够让开发者直接在场景里直观地看到对象的坐标分布 ,利用Scale值来控制自发光强度 ,这样就能快速识别出不同尺寸的对象。
HLSL
float3 _Object_Scale = float3(length(float3(UNITY_MATRIX_M[0].x, UNITY_MATRIX_M[1].x, UNITY_MATRIX_M[2].x)),
length(float3(UNITY_MATRIX_M[0].y, UNITY_MATRIX_M[1].y, UNITY_MATRIX_M[2].y)),
length(float3(UNITY_MATRIX_M[0].z, UNITY_MATRIX_M[1].z, UNITY_MATRIX_M[2].z)));
Object节点于通用渲染管线(URP)里的行为,跟在高清渲染管线(HDRP)中的行为,或许存有细微的差别,这些差异是由不同管线针对矩阵运算的优化方式所导致的,也是因着色器变量命名以及访问路径的不同造成的。
对于打算在多条管线里运用的着色器,得在目标管线那儿开展实际的测试予以验证。建议开发者在项目刚开始的时候就清晰地确定渲染管线的选择,并且在部署之前针对每一个管线版本去进行专门的适配以及调整。
当Position输出呈现出显示不正确的状况时,通常来讲其原因涵盖了对象处于未被正确设置的世界空间子级当中,或者是着色器在进行计算之际误用了对象空间的数据而非世界空间的数据。去检查对象层级以及节点连接便能够定位问题。
要是Scale端口返回的值跟预期不一样,那就得去确认一下是不是忽略了父级对象的缩放所产生的影响。因为Scale输出的是累积世界空间缩放这个数值,对于处于嵌套结构里的子对象而言,那个值将会是所有父级缩放以及自身缩放相乘之后的结果。
通常情况下,Object节点会和Vector节点搭配着来使用。比如说,借助Split和Multiply节点对Position数据予以处理,能够计算得出对象相对于特定平面的距离,进而据此创建出基于高度的渐变透明这种效果。
场景若是在移动平台,或者是那种需要大量进行绘制调用的情况,那么就应当尽可能地去削减Object节点的重复计算。优化性能的办法有两种,一种是在主节点里事先进行计算并且缓存好所需的值,另一种是借助材质属性块来传递特定的数据。
审视完此文,你有无在项目里借助Object节点去达成过那种令人记忆深刻的创意成效呢?欢迎于评论区去分享你的经历,以使更多开发者一同展开学习交流。要是觉着此文对你存有帮助,请予以点赞并且分享给更多有需求的朋友。
![【节点】[Object节点]原理解析与实际应用 【节点】[Object节点]原理解析与实际应用](https://cdn.pixabay.com/photo/2017/03/07/20/53/cog-wheels-2125183_1280.jpg)