来一张AI提供的资料
一,坐标空间转换
空间转换中,一般有五个空间转换,模型空间→世界空间→视图空间→裁剪空间→NDC空间(其次坐标空间,执行其次坐标后的空间)→屏幕空间
核心原则
1,数据依赖原则
当逻辑需要相对坐标系属性(如模型UV、顶点色)时,优先在模型空间处理(如gl_Vertex变换前)
当逻辑依赖全局交互状态(如光照方向、物理碰撞)时,必须转换到世界空间后处理
2,性能优化准则
在顶点着色器阶段处理空间转换(如UNITY_MATRIX_MVP),利用GPU并行性在片段着色器中避免重复坐标转换,通过TEXCOORD传递预处理数据
3,精度控制策略
高精度计算(如物理模拟)应在世界空间使用double类型
视觉效果类计算(如雾效)可在视图空间使用float类型
空间转换代码
Shader "SpaceTransform/BasicChain"{SubShader { Pass { CGPROGRAM#pragma vertex vert #pragma fragment frag#include "UnityCG.cginc"struct appdata {float4 vertex : POSITION;};struct v2f {float4 pos : SV_POSITION;float4 worldPos : TEXCOORD0;float4 viewPos : TEXCOORD1;};v2f vert (appdata v) {v2f o;// 模型空间 → 世界空间 o.worldPos = mul(unity_ObjectToWorld, v.vertex); // 世界空间 → 视图空间 o.viewPos = mul(UNITY_MATRIX_V, o.worldPos); // 视图空间 → 裁剪空间 o.pos = mul(UNITY_MATRIX_P, o.viewPos); return o;}fixed4 frag (v2f i) : SV_Target {return fixed4(1,1,1,1); // 纯白输出 }ENDCG }
}
}