Unity ShaderLab特效教程 空间坐标转换

空间转换
两种写法

unity5.6以下版本写法记作“old”:mul(v.vertex,UNITY_MATRIX_MVP)
unity5.6以上版本写法记作“new”:UnityObjectToClipPos(v.vertex)

v2f vert (a2v v){
      v2f o;
      //将顶点从模型空间转换为裁剪空间,因为2d就是平面映射。
      o.vertex = UnityObjectToClipPos(v.vertex);
      //将顶点从模型空间转换为裁剪空间,因为2d就是平面映射。
      o.vertex = UnityObjectToClipPos(v.vertex);
      //模型坐标转为世界坐标,因为要计算绝对位置
      o.pos = mul(unity_ObjectToWorld, v.vertex);
      //将坐标转为裁剪空间,否则就无法正常可视化
      o.pos = mul(UNITY_MATRIX_VP, o.pos);
      //输出法线 = 转换后的世界坐标法线
      float3 worldNormal = UnityObjectToWorldNormal(o.normal);
      //从世界坐标转换到裁剪空间的坐标信息
      pIn.pos = mul(UNITY_MATRIX_VP, p[0].pos);
      //从世界坐标转换到裁剪空间的坐标信息
      pIn1.pos = mul(UNITY_MATRIX_VP, pos);
      //当前的模型观察矩阵,  用于将顶点/方向数据从模型空间变换到观察空间
	  float4 pos = mul(UNITY_MATRIX_MV,v.vertex)
	  //UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可以用于得到UNITY_MATRIX_MV的逆矩阵
	  float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV,v.normal);

	  //获取模型在世界空间的法线向量  计算与输入向量方向相同的单位向量
	  fixed3 worldNormal = normalize(i.worldNormal);
	  //仅用于向前渲染中,输入一个世界空间中的顶点位置, 返回世界空间中从该点到光源的光照方向。没有被归一化
	  fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
	  //输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
	  fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
}   
自定义工具函数 随机函数
//获取随机噪点值,这里使用的因子是原x+时间长度
float noise = random(o.pos.x +  _Time.y * 0.4);
//噪点/随机数发生器
float random (float n) {
      return frac(sin(dot(n, float2(12.9898,78.233)))*43758.5453123);
}

发布了134 篇原创文章 · 获赞 37 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lengyoumo/article/details/104091416
今日推荐