shader中的UnityObjectToClipPos和UNITY_MATRIX_MVP

在unity5.6以上版本中,shader中的UNITY_MATRIX_MVP将会被UnityObjectToClipPos替代,以后我们在写顶点函数时就是这样的
v2f vert(appdata v)
{
v2f o;
//unity5.6以前的写法
//o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);

//unity5.6以后的写法
 o.vertex = UnityObjectToClipPos(v.vertex);    
return o;  

}

相应的,UNITY_MATRIX_VP,UNITY_MATRIX_P都有对应的封装方法

UnityWorldToClipPos,
UnityViewToClipPos

在这以前,你还需要在Pass中加上一句 #include “UnityCG.cginc”

### Shader 中 `OUT_Data_Vert` 的定义与用法 在 Unity Shader 编程中,`OUT_DataVert` 并不是一个内置的关键字或标准结构名称,但它通常是一个开发者自定义的数据结构,用于存储顶点着色器(Vertex Shader中的中间数据并将其传递到片段着色器(Fragment Shader)。这种命名方式表明它可能被用来表示从顶点阶段输出的数据。 #### 数据流概述 在一个典型的 GPU 渲染管线中,顶点着色器负责处理输入的顶点属性(如位置、颜色、UV 坐标等),并将这些经过变换后的数据传递给后续阶段。为了完成这一过程,开发人员会创建一个自定义的结构体来封装这些数据[^1]。 #### 结构体定义示例 以下是 `OUT_Data_Vert` 可能的一个典型定义: ```c++ struct OUT_Data_Vert { float4 position : SV_POSITION; // 裁剪空间下的顶点坐标 float3 normal : NORMAL; // 法线向量 float2 uv : TEXCOORD0; // UV 纹理坐标 float3 viewDir : TEXCOORD1; // 视角方向向量 }; ``` 在这个例子中: - **position**: 表示裁剪空间下最终的位置信息。 - **normal**: 保存了模型表面的方向矢量,在光照计算中有重要作用。 - **uv**: 提供纹理映射所需的二维坐标系。 - **viewDir**: 如果涉及到基于视角的效果(比如高光反射),则需要提前计算好每个像素相对于摄像机的方向向量[^2]。 #### 使用场景分析 当编写 Vertex Fragment Shaders 时,该结构体会作为两者之间的桥梁存在。具体来说,在 VS 阶段填充此结构实例的各项成员变量;而在 FS 则读取它们来进行进一步的颜色渲染或其他效果生成操作。 例如下面展示了一个简单的实现流程: ```c++ // 顶点着色器部分 OUT_Data_Vert vert(appdata_base v){ OUT_Data_Vert o; o.position = mul(UNITY_MATRIX_MVP, v.vertex); o.normal = normalize(mul((float3x3)unity_WorldToObject,v.normal)); o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); half3 worldPos = mul(_ObjectToWorld,(half4)v.vertex).xyz; o.viewDir = _WorldSpaceCameraPos.xyz - worldPos; return o; } // 片元着色器部分 fixed4 frag(OUT_Data_Vert i):SV_Target{ fixed3 lightColor = UNITY_LIGHTMODEL_AMBIENT.rgb; fixed3 diffuseReflection = saturate(dot(i.normal ,_LightDirection)) * _Diffuse.rgb *_LightColor0.rgb ; fixed3 specularHighlight = pow(max(0,dot(reflect(-_LightDirection,i.normal),normalize(i.viewDir))),8)*_Specular.rgb ; fixed3 finalColor=lightColor+diffuseReflection+specularHighlight; return tex2D(_MainTex,i.uv)*fixed4(finalColor,1.0f); } ``` 上述代码展示了如何利用 `OUT_Data_Vert` 来传输必要的几何材质参数至片断程序以便执行复杂的逐象素照明运算^。 #### 总结 通过合理设计像 `OUT_Data_Vert` 这样的中介载体可以帮助我们更清晰地理顺整个图形绘制逻辑链路,并且使得不同功能模块之间能够顺畅交互协作。同时也要注意保持其轻量化原则以免造成不必要的性能开销。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值