为了把顶点或方向矢量从观察空间变换到模型空间
// 方法一, 使用transpose 函数对UNITY_MATRIX_IT_MV 进行转置,
// 得到UNITY_MATRIX_MV 的逆矩阵,然后进行列矩阵乘法,
// 把观察空间中的点或方向矢量变换到模型空间中
float4 modelPos = mul(transpose(UNITY_MATRIX_ IT_MV), viewPos);
// 方法二, 不直接使用转置函数transpose ,而是交换mul 参数的位置,使用行矩阵乘法
// 本质和方法一是完全一样的
float4 modelPos = mul(viewPos, UNITY_MATRIX_IT_MV);
TIM截图20190319215436.png
TIM截图20190319215502.png
TRANSFORM_TEX(v.texcoord, _MainTex);
TRANSFORM_TEX方法比较简单,就是将模型顶点的uv和Tiling、Offset两个变量进行运算,计算出实际显示用的定点uv。
该方法可以在UnityCG.cginc文件中找到,内容也很简单:
// Transforms 2D UV by scale/bias property
define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
配合使用时的代码:
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
其中
v是appdata_base类型,v.texcoord就是模型顶点的uv数据。
_MainTex是使用的图片。
name##_ST实际上就是_MainTex_ST。
name##_ST.xy就是Tiling的xy值。
name##_ST.zw就是Offset的xy值。
tex2D(_MainTex, i.uv); 对图片进行采样 参数1 是采样图片
// Use the refract dir in world space to access the cubemap
fixed3 refraction = texCUBE(_Cubemap, i.worldRefr).rgb * _RefractColor.rgb; 这是一个立方体的采样,
//CG 的refract函数来计算折射方向 参数1 入射光线方向(必须归一),2:表现法线,法线方向归一,3:入射光线所在介质的折射率和折射光线所在介质的折射率之间的比值
o.worldRefr = refract(-normalize(o.worldViewDir), normalize(o.worldNormal), _RefractRatio);
以上这些函数都没有归一化
WorldSpaceLightDir、UnityWorldSpaceLightDir 和ObjSpaceLightDir,稍微复杂一些,这是因为, Unity 帮我们处理了不同种类光源的情况。需要注意的是,这3 个函数仅可用于前向渲染(关于什么是前向渲染会在9.1 节中讲到)。这是因为只有在前向渲染时,这3 个函数里使用的内置变量 _WorldSpaceLightPos0 等才会被正确赋值。
光照 阴影使用的函数
SHADOW_ COORDS 、TRANSFER_SHADOW 和SHADOW_ATTENUATION 是计算阴影时的“三剑客”。这些内置宏帮助我们在必要时计算光源的阴影
在前向渲染中, 宏SHADOW_COORDS实际上就是声明了一个名为** _ShadowCoord的阴影纹理坐标变量。而TRANSFER_SHADOW的实现会根据平台不同而有所差异。如果当前平台可以使用屏幕空间的阴影映射技术(通过判断是否定义了UNITY_NO_SCREENSPACE_SHADOWS来得到) , TRANSFER_SHADOW 会调用内置的ComputeScreenPos 函数来计算
_ShadowCoord** ;如果该平台不支持屏幕空间的阴影映射技术, 就会使用传统的阴影映射技术,TRANSFER_SHADOW 会把顶点坐标从模型空间变换到光源空间后存储到ShadowCoord 中。然后,** SHADOW_ATTENUATION** 负责使用ShadowCoord 对相关的纹理进行采样,得到阴影信息。
参考:https://blog.csdn.net/laverfever/article/details/23962411
官方 shader API:https://docs.unity3d.com/Manual/SL-BuiltinFunctions.html
https://docs.unity3d.com/ScriptReference/Shader.html
TANGENT_SPACE_ROTATION 宏 相当于嵌入如下两行代码:
float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w;
float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );
也就是构造出 tangent space 的坐标系, 定义转换world space的向量到tangent space的rotation 矩阵。
Hidden Shader的
表示是内置shader,不能在材质球的下拉列表里看到。一般你要覆盖内置shader的时候才会这么写,一般是覆盖默认地形shader 相关的 地面 草 广告牌 等…
网友评论