Core
结构体列表:
VertexPositionInputs 类型 注解 positionWS float3 世界空间位置 (World Space) positionVS float3 视图空间位置 (View Space) positionCS float4 裁剪空间位置 (Clip Space) positionNDC float4 齐次空间归一化的坐标 (NDC)
VertexNormalInputs 类型 注解 tangentWS real3 切线位置 (World Space) bitangentWS real3 双切线位置 (World Space) normalWS float3 法线位置 (World Space)
函数体详解
GetVertexPositionInputs 获取输入顶点坐标信息 参数1 (positionOS) 物体局部位置(Position Object Space) 注解 这里主要是把物体坐标经过一些列的转换和裁剪空间计算
VertexPositionInputs GetVertexPositionInputs ( float3 positionOS)
{
VertexPositionInputs input;
input. positionWS = TransformObjectToWorld ( positionOS) ;
input. positionVS = TransformWorldToView ( input. positionWS) ;
input. positionCS = TransformWorldToHClip ( input. positionWS) ;
float4 ndc = input. positionCS * 0.5f ;
input. positionNDC. xy = float2 ( ndc. x, ndc. y * _ProjectionParams. x) + ndc. w;
input. positionNDC. zw = input. positionCS. zw;
return input;
}
GetVertexNormalInputs 获取输入顶点法线信息 参数1 (normalOS) 物体局部法线位置(Normal Position Object Space) 注解 这里主要归一化法线和切线位置
VertexNormalInputs GetVertexNormalInputs ( float3 normalOS)
{
VertexNormalInputs tbn;
tbn. tangentWS = real3 ( 1.0 , 0.0 , 0.0 ) ;
tbn. bitangentWS = real3 ( 0.0 , 1.0 , 0.0 ) ;
tbn. normalWS = TransformObjectToWorldNormal ( normalOS) ;
return tbn;
}
GetVertexNormalInputs 获取输入顶点法线信息(重载函数) 参数1 (normalOS) 物体局部法线位置(Normal Position Object Space) 参数2 (tangentOS) 物体局部切线位置(Tangent Position Object Space) 注解 这里主要归一化法线和计算切线位置。
VertexNormalInputs GetVertexNormalInputs ( float3 normalOS, float4 tangentOS)
{
VertexNormalInputs tbn;
real sign = tangentOS. w * GetOddNegativeScale ( ) ;
tbn. normalWS = TransformObjectToWorldNormal ( normalOS) ;
tbn. tangentWS = TransformObjectToWorldDir ( tangentOS. xyz) ;
tbn. bitangentWS = cross ( tbn. normalWS, tbn. tangentWS) * sign;
return tbn;
}
GetCameraPositionWS 获取渲染相机的世界坐标 注解 获取渲染相机的世界坐标.
float3 GetCameraPositionWS ( )
{
return _WorldSpaceCameraPos;
}
GetScaledScreenParams 获取屏幕缩放参数信息 注解 获取屏幕缩放参数信息.
float4 GetScaledScreenParams ( )
{
return _ScaledScreenParams;
}
AlphaDiscard 丢弃Alpha 参数1 (alpha) alpha 参数2 (cutoff) 界限 参数3 (offset) 抵消值 注解 丢弃Alpha.
void AlphaDiscard ( real alpha, real cutoff, real offset = 0.0 h)
{
#ifdef _ALPHATEST_ON
clip ( alpha - cutoff + offset) ;
#endif
}
OutputAlpha 输出Alpha 参数1 (outputAlpha) alpha 注解 输出Alpha和绘制过程中的对象Alpha进行叠加.
half OutputAlpha ( half outputAlpha)
{
return saturate ( outputAlpha + _DrawObjectPassData. a) ;
}
NormalizeNormalPerVertex 逐顶点规格化法线(透视) 参数1 (normalWS) 世界空间的法线位置 注解 逐顶点规格化法线.
real3 NormalizeNormalPerVertex ( real3 normalWS)
{
#if defined(SHADER_QUALITY_LOW) && defined(_NORMALMAP)
return normalWS;
#else
return normalize ( normalWS) ;
#endif
}
A word on normalization of normals: 关于法线规范化的一句话 : For better quality normals should be normalized before and after interpolation. 为了获得更好的质量,法线应该在前后规格化插入。
In vertex, skinning or blend shapes might vary significantly the lenght of normal. 在顶点中,蒙皮或混合形状可能会显著改变法线的长度。 In fragment, because even outputting unit-length normals interpolation can make it non-unit. 在片段中,因为即使输出单位长度的法线插值也会使其成为非单位。 In fragment when using normal map, because mikktspace sets up non orthonormal basis. 在使用法线贴图时,由于mikktspace设置了非正交基。 However we will try to balance performance vs quality here as also let users configure that as shader quality tiers. 不过,我们将在这里尝试平衡性能和质量,并让用户将其配置为着色器质量层。 Low Quality Tier: Normalize either per-vertex or per-pixel depending if normalmap is sampled. 低质量层:规格化每顶点或每像素取决于是否采样法线贴图。 Medium Quality Tier: Always normalize per-vertex. Normalize per-pixel only if using normal map. 中等质量层:始终按顶点规格化。仅当使用法线贴图时规格化每像素 High Quality Tier: Normalize in both vertex and pixel shaders. 高质量层:在顶点和像素着色器中规格化。
NormalizeNormalPerPixel 逐像素规格化法线(透视) 参数1 (normalWS) 世界空间的法线位置 注解 逐像素规格化法线.
real3 NormalizeNormalPerPixel ( real3 normalWS)
{
#if defined(SHADER_QUALITY_HIGH) || defined(_NORMALMAP)
return normalize ( normalWS) ;
#else
return normalWS;
#endif
}
ComputeScreenPos 计算屏幕坐标信息 参数1 (positionCS) 裁剪空间下的位置(Clip Space) 注解 计算屏幕坐标信息
float4 ComputeScreenPos ( float4 positionCS)
{
float4 o = positionCS * 0.5f ;
o. xy = float2 ( o. x, o. y * _ProjectionParams. x) + o. w;
o. zw = positionCS. zw;
return o;
}
ComputeFogFactor 计算雾的因子 参数1 (z) 雾深度 注解 计算雾的因子
real ComputeFogFactor ( float z)
{
float clipZ_01 = UNITY_Z_0_FAR_FROM_CLIPSPACE ( z) ;
#if defined(FOG_LINEAR)
float fogFactor = saturate ( clipZ_01 * unity_FogParams. z + unity_FogParams. w) ;
return real ( fogFactor) ;
#elif defined(FOG_EXP) || defined(FOG_EXP2)
return real ( unity_FogParams. x * clipZ_01) ;
#else
return 0.0 h;
#endif
}
ComputeFogIntensity 计算雾的强度 参数1 (fogFactor) 雾因子 注解 计算雾的强度
real ComputeFogIntensity ( real fogFactor)
{
real fogIntensity = 0.0 h;
#if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)
#if defined(FOG_EXP)
fogIntensity = saturate ( exp2 ( - fogFactor) ) ;
#elif defined(FOG_EXP2)
fogIntensity = saturate ( exp2 ( - fogFactor * fogFactor) ) ;
#elif defined(FOG_LINEAR)
fogIntensity = fogFactor;
#endif
#endif
return fogIntensity;
}
MixFogColor 混合雾颜色 参数1 (fragColor) 片段颜色 参数2 (fogColor) 雾颜色 参数3 (fogFactor) 雾因子 注解 混合雾颜色
half3 MixFogColor ( real3 fragColor, real3 fogColor, real fogFactor)
{
#if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)
real fogIntensity = ComputeFogIntensity ( fogFactor) ;
fragColor = lerp ( fogColor, fragColor, fogIntensity) ;
#endif
return fragColor;
}
MixFog 混合雾 参数1 (fragColor) 片段颜色 参数2 (fogFactor) 雾因子 注解 混合雾颜色
half3 MixFog ( real3 fragColor, real fogFactor)
{
return MixFogColor ( fragColor, unity_FogColor. rgb, fogFactor) ;
}
TransformStereoScreenSpaceTex 转换立体屏幕空间纹理 参数1 (uv) uv 参数2 (w) w 注解 转换立体屏幕空间纹理
float2 TransformStereoScreenSpaceTex ( float2 uv, float w)
{
float4 scaleOffset = unity_StereoScaleOffset[ unity_StereoEyeIndex] ;
return uv. xy * scaleOffset. xy + scaleOffset. zw * w;
}
UnityStereoTransformScreenSpaceTex Unity转换立体屏幕空间纹理 参数1 (uv) uv 注解 Unity转换立体屏幕空间纹理,要开启 UNITY_SINGLE_PASS_STEREO 否则没实现。
float2 UnityStereoTransformScreenSpaceTex ( float2 uv)
{
return TransformStereoScreenSpaceTex ( saturate ( uv) , 1.0 ) ;
}