在计算光照模型时我们需要得到许多数据,比如光源方向、视角方向这种基本信息。
在之前的例子中都是自行在代码里计算的,比如:
normalize(_WorldSpaceLight0Pos.xyz) 得到光源方向(这种方法实际只适用平行光)
normalize(_WorldSpaceCameraPos.xyz-i.worldPosition.xyz) 得到视角方向
但是如果需要处理更复杂的光照类型(如点光源和聚光灯),之前的计算方式是错误的。
Unity提供了一些内置函数来帮助我们计算这些信息,在之前的章节我们也谈及过。
UnityCG.cginc中一些常用的结构体 | ||
---|---|---|
名称 | 描述 | 包含的变量 |
appdata_base | 可用于顶点着色器的输入 | 顶点位置、顶点法线、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标 |
appdata_img | 可用于顶点着色器的输入 | 顶点位置、第一组纹理坐标 |
v2f_img | 可用于顶点着色器的输出 | 裁剪空间的位置、纹理坐标 |
UnityCG.cginc中一些常用的帮助函数 | |
---|---|
函数名 | 描述 |
float3 WorldSpaceViewDir(float4 v) | 输入一个模型空间的顶点位置,返回世界空间中从该点到摄像机的观察方向。内部实现使用了UnityWorldSpaceViewDir函数 |
float3 UnityWorldSpaceViewDir(float4 v) | 输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向。 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间的顶点位置,返回模型空间中从该点到摄像机的观察方向。 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。内部实现使用了UnityWorldSpaceLightDir函数。没有被归一化。 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化。 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被归一化。 |
float3 UnityObjectToWorldNormal(float3 norm) | 把法线方向从模型空间转换到世界空间中 |
float3 UnityObjectToWorldDir(float3 dir) | 把方向矢量从模型空间变换到世界空间中 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向矢量从世界空间转换到模型空间中 |