Unity3D Shader系列之中常用内置变量与方法


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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值