未完成的空间转换表
数据类型
名称 | shader中的变量名 | 数据类型 | 说明 |
---|
vertex | POSITION | float4 | 顶点在空间中的位置 |
normal | NORMAL | float4 | 垂直于顶点的直线 |
tengent | TANGENT | float4 | 与顶点的法线垂直 |
Direction | | float3 | 顶点在空间中的朝向 |
Destance | | float3 | 两点之间的距离 |
texcoord | TEXCOORD0 | float4 | 处理贴图的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 = UnityObjectToViewPos(v.vertex);
vec = UnityWorldToViewPos(v.vertex);
vec = UnityObjectToWorldDir(v.vertex);
vec = UnityViewToClipPos(v.vertex);
vec = UnityWorldToClipPos(v.vertex);
vec = UnityObjectToWorldNormal(v.vertex);
vec = UnityWorldToObjectDir(v.vertex);
vec = WorldSpaceViewDir(v.vertex);
vec = ObjSpaceViewDir (v.vertex);
vec = WorldSpaceLightDir (v.vertex);
vec = ObjSpaceLightDir (v.vertex);
自定义工具函数 随机函数
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));