目录
TODO 未完待续…
https://docs.unity3d.com/Manual/SL-BuiltinIncludes.html
https://docs.unity3d.com/Manual/SL-BuiltinFunctions.html
https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html
1 常用变量
1.1 顶点着色器输入结构体体
位于UnityCG.cginc
。
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_img
{
float4 vertex : POSITION;
half2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
1.2 _LightColor0
_LightColor0
位于UnityLightingCommon.cginc
,可通过Lighting.cginc
间接引入。
- "LightMode" = "Vertex"
会设置4个光源,并按亮度从明到暗进行排序,它们的值会存储在unity_LightColor[n], unity_LightPosition[n], unity_LightAtten[n]这些数组中。因此,[0]总会得到最亮的光源。 - "LightMode = "ForwardBase"
_LightColor0将会是主要的directional light的颜色。 - "LightMode" = "ForwardAdd"
和上面一样, _LightColor0将是该逐像素光源的颜色。
fixed4 _LightColor0;
1.3 _WorldSpaceLightPos0
世界坐标中光源的位置或方向向量。
如果 _WorldSpaceLightPos0.w为0,表示该光源为平行光。
_WorldSpaceLightPos0.w为1。则表示光源为点光源或聚光灯。
_WorldSpaceLightPos0
位于UnityShaderVariables.cginc
,可通过UnityCG.cginc
间接引入。
// 定义如下
#ifdef USING_DIRECTIONAL_LIGHT
half4 _WorldSpaceLightPos0;
#else
float4 _WorldSpaceLightPos0;
#endif
1.4 UNITY_LIGHTMODEL_AMBIENT
环境光。
UNITY_LIGHTMODEL_AMBIENT
位于UnityShaderVariables.cginc
,可通过UnityCG.cginc
间接引入。
// 定义如下
#define UNITY_LIGHTMODEL_AMBIENT (glstate_lightmodel_ambient * 2)
1.5 unity_ObjectToWorld
模型空间到世界空间的变换矩阵。4×4的矩阵。
位于UnityShaderVariables.cginc
,可通过UnityCG.cginc
间接引入。
// 定义如下
float4x4 unity_ObjectToWorld;
float4x4 unity_WorldToObject;
1.6 unity_WorldToObject
世界空间到模型空间的变换矩阵。4×4的矩阵。
其他见1.5。
2 常用方法
2.1 局部坐标变换到裁剪空间
位于“UnityShaderUtilities.cginc”
,可通过UnityCG.cginc
间接引入。
// 定义如下
inline float4 UnityObjectToClipPos(float4 pos);
// 或
inline float4 UnityObjectToClipPos(in float3 pos)
2.2 模型空间法线变换到世界空间
// 位于`“UnityCG.cginc”`
inline float3 UnityObjectToWorldNormal( in float3 norm );
2.3 TRANSFORM_TEX
位于“UnityCG.cginc”
。
// 定义如下
// Transforms 2D UV by scale/bias property
#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)