Unity ShaderLab 坐标空间转换及方法

shader基础
shader空间坐标介绍
未完成的空间转换表
数据类型
名称shader中的变量名数据类型说明
vertexPOSITIONfloat4顶点在空间中的位置
normalNORMALfloat4垂直于顶点的直线
tengentTANGENTfloat4与顶点的法线垂直
Directionfloat3顶点在空间中的朝向
Destancefloat3两点之间的距离
texcoordTEXCOORD0float4处理贴图的UV坐标
模型空间
输出空间模型空间世界空间观察空间裁剪空间
坐标mul(unity_ObjectToWorld, v.vertex) = mul(UNITY_MATRIX_M, 方向或坐标)float4 UnityObjectToViewPos(float4) = mul(UNITY_MATRIX_MV,顶点或方向)mul(UNITY_MATRIX_MVP, 顶点或方向)
方向float3 UnityObjectToWorldDir(float3) :把方向矢量从模型空间变换到世界空间中
法线float3 UnityObjectToWorldNormal(float3) 把法线方向从模型空间转换到世界空间中mul(UNITY_MATRIX_IT_MV, 顶点或方向)
灯光float3 ObjSpaceLightDir(float3)-float4 ObjectSpaceLightDir(float4):输入模型空间的顶点坐标,返回模型空间中从该点到光源的光照方向。需前向渲染中、且还没归一化
相机float3 ObjSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向。float3 WorldSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向。
世界空间
输出空间模型空间世界空间观察空间裁剪空间齐次空间
坐标mul(unity_WorldToObject, 坐标或方向) =mul(UNITY_MATRIX_I_M, 坐标或方向)mul(UNITY_MATRIX_V, 坐标或方向)float4 UnityWorldToClipPos(float4)
方向float3 Unity WorldToObjectDir(float3 dir)-float3 UnityWorldToObjectDir(float3)把方向矢量从世界空间变换到模型空间中
法线
灯光float3 UnityWorldSpaceLightDir(float4 v) -float3 WorldSpaceLightDir(float4 v) 仅可用于前向渲染中。输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化
相机float3 UnityWorldSpaceViewDir(float4 v) 输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
观察空间
输出空间模型空间世界空间观察空间裁剪空间齐次空间
坐标mul(UNITY_MATRIX_T_MV,顶点或方向)mul(UNITY_MATRIX_I_V, 顶点或方向)float4 UnityViewToClipPos(float4 ) = mul(UNITY_MATRIX_P, 顶点或方向)
方向
法线
灯光
相机
两种写法

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


					//将顶点从模型空间转换为裁剪空间
                    float3 vec;
                    //模型空间转为裁剪空间
                    vec = UnityObjectToClipPos(v.vertex);
                    // vec =  UnityObjectToClipPos(float4(v.vertex), 1.0));
                    
                    //模型空间转换为观察空间
                    vec =  UnityObjectToViewPos(v.vertex);
                    // vec =  mul(UNITY_MATRIX_MV, float4(v.vertex), 1.0)).xyz;
                    //从世界空间转到观察空间
                    vec =  UnityWorldToViewPos(v.vertex);

                    //模型空间转换到世界空间
                    vec =  UnityObjectToWorldDir(v.vertex);
                    //观察空间转为裁剪空间
                    vec =  UnityViewToClipPos(v.vertex);
                    //世界空间转到裁剪空间
                    vec =  UnityWorldToClipPos(v.vertex);

                    //法线
                    //法线从模型空间转换到世界空间
                    vec =  UnityObjectToWorldNormal(v.vertex);
                    //世界空间转到模型空间
                    vec =  UnityWorldToObjectDir(v.vertex);
                    
                    //摄像机相关
                    //输入一个object空间顶点位置,返回世界空间中从该点到摄像机的观察方向。
                    vec =  WorldSpaceViewDir(v.vertex); 
                    //输入一个object空间顶点位置,返回object空间中从该点到摄像机的观察方向。
                    vec =  ObjSpaceViewDir (v.vertex);

                    //灯光
                    //仅用于前向渲染,输入一个object空间顶点的位置,返回世界空间中从该点到光源的光照方向
                    vec =  WorldSpaceLightDir (v.vertex);
                    //仅用于前向渲染,输入一个object空间顶点的位置,返回object空间中从该点到光源的光照方向
                    vec = ObjSpaceLightDir (v.vertex);

自定义工具函数 随机函数
//获取随机噪点值,这里使用的因子是原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);
}

法线、切线、副切线\副法线

物体与摄像机的方向、距离

距离

// 将坐标转换到裁剪空间
float3 posView = mul(UNITY_MATRIX_MV,v.vertex).xyz;
// 物体与镜头距离
float distance = length(posView);

方向

//将顶点从模型空间转换到世界空间
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
//获取世界空间中,顶点到相机的方向
o.viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千年奇葩

从来没受过打赏,这玩意好吃吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值