Core 核心的函数

Core

结构体列表:

结构体注解
VertexPositionInputs顶点位置输入
VertexNormalInputs顶点法线输入
函数体注解
GetVertexPositionInputs获取输入顶点坐标信息
GetVertexNormalInputs获取输入顶点法线信息
GetVertexNormalInputs获取输入顶点法线信息(重载函数)
GetCameraPositionWS获取渲染相机的世界坐标
GetScaledScreenParams获取屏幕缩放参数信息
AlphaDiscard丢弃Alpha
OutputAlpha输出Alpha
NormalizeNormalPerVertex逐顶点规格化法线(透视)
NormalizeNormalPerPixel逐像素规格化法线(透视)
ComputeScreenPos计算屏幕坐标信息
ComputeFogFactor计算雾的因子
ComputeFogIntensity计算雾的强度
MixFogColor混合雾颜色
MixFog混合雾
TransformStereoScreenSpaceTex转换立体屏幕空间纹理(需要开启宏 UNITY_SINGLE_PASS_STEREO)
UnityStereoTransformScreenSpaceTexUnity转换立体屏幕空间纹理

点击我不看表格

VertexPositionInputs类型注解
positionWSfloat3世界空间位置 (World Space)
positionVSfloat3视图空间位置 (View Space)
positionCSfloat4裁剪空间位置 (Clip Space)
positionNDCfloat4齐次空间归一化的坐标 (NDC)
VertexNormalInputs类型注解
tangentWSreal3切线位置 (World Space)
bitangentWSreal3双切线位置 (World Space)
normalWSfloat3法线位置 (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;
}

Top

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;
}

Top

GetVertexNormalInputs获取输入顶点法线信息(重载函数)
参数1 (normalOS)物体局部法线位置(Normal Position Object Space)
参数2 (tangentOS)物体局部切线位置(Tangent Position Object Space)
注解这里主要归一化法线和计算切线位置。
VertexNormalInputs GetVertexNormalInputs(float3 normalOS, float4 tangentOS)
{
    VertexNormalInputs tbn;

    // mikkts space compliant. only normalize when extracting normal at frag.
    real sign = tangentOS.w * GetOddNegativeScale();
    tbn.normalWS = TransformObjectToWorldNormal(normalOS);
    tbn.tangentWS = TransformObjectToWorldDir(tangentOS.xyz);
    tbn.bitangentWS = cross(tbn.normalWS, tbn.tangentWS) * sign;
    return tbn;
}

Top

GetCameraPositionWS获取渲染相机的世界坐标
注解获取渲染相机的世界坐标.
float3 GetCameraPositionWS()
{
    return _WorldSpaceCameraPos;
}

Top

GetScaledScreenParams获取屏幕缩放参数信息
注解获取屏幕缩放参数信息.
float4 GetScaledScreenParams()
{
    return _ScaledScreenParams;
}

Top

AlphaDiscard丢弃Alpha
参数1 (alpha)alpha
参数2 (cutoff)界限
参数3 (offset)抵消值
注解丢弃Alpha.
void AlphaDiscard(real alpha, real cutoff, real offset = 0.0h)
{
#ifdef _ALPHATEST_ON
    clip(alpha - cutoff + offset);
#endif
}

Top

OutputAlpha输出Alpha
参数1 (outputAlpha)alpha
注解输出Alpha和绘制过程中的对象Alpha进行叠加.
half OutputAlpha(half outputAlpha)
{
    return saturate(outputAlpha + _DrawObjectPassData.a);
}

Top

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.

为了获得更好的质量,法线应该在前后规格化插入。

  1. In vertex, skinning or blend shapes might vary significantly the lenght of normal.

    在顶点中,蒙皮或混合形状可能会显著改变法线的长度。
  2. In fragment, because even outputting unit-length normals interpolation can make it non-unit.

    在片段中,因为即使输出单位长度的法线插值也会使其成为非单位。
  3. 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.

    高质量层:在顶点和像素着色器中规格化。

Top

NormalizeNormalPerPixel逐像素规格化法线(透视)
参数1 (normalWS)世界空间的法线位置
注解逐像素规格化法线.
real3 NormalizeNormalPerPixel(real3 normalWS)
{
#if defined(SHADER_QUALITY_HIGH) || defined(_NORMALMAP)
    return normalize(normalWS);
#else
    return normalWS;
#endif
}

Top

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;
}

Top

ComputeFogFactor计算雾的因子
参数1 (z)雾深度
注解计算雾的因子
real ComputeFogFactor(float z)
{
    float clipZ_01 = UNITY_Z_0_FAR_FROM_CLIPSPACE(z);
#if defined(FOG_LINEAR)
    // factor = (end-z)/(end-start) = z * (-1/(end-start)) + (end/(end-start))
    float fogFactor = saturate(clipZ_01 * unity_FogParams.z + unity_FogParams.w);
    return real(fogFactor);
#elif defined(FOG_EXP) || defined(FOG_EXP2)
    // factor = exp(-(density*z)^2)
    // -density * z computed at vertex
    return real(unity_FogParams.x * clipZ_01);
#else
    return 0.0h;
#endif
}

Top

ComputeFogIntensity计算雾的强度
参数1 (fogFactor)雾因子
注解计算雾的强度
real ComputeFogIntensity(real fogFactor)
{
    real fogIntensity = 0.0h;
#if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)
#if defined(FOG_EXP)
    // factor = exp(-density*z)
    // fogFactor = density*z compute at vertex
    fogIntensity = saturate(exp2(-fogFactor));
#elif defined(FOG_EXP2)
    // factor = exp(-(density*z)^2)
    // fogFactor = density*z compute at vertex
    fogIntensity = saturate(exp2(-fogFactor * fogFactor));
#elif defined(FOG_LINEAR)
    fogIntensity = fogFactor;
#endif
#endif
    return fogIntensity;
}

Top

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;
}

Top

MixFog混合雾
参数1 (fragColor)片段颜色
参数2 (fogFactor)雾因子
注解混合雾颜色
half3 MixFog(real3 fragColor, real fogFactor)
{
    return MixFogColor(fragColor, unity_FogColor.rgb, fogFactor);
}

Top

TransformStereoScreenSpaceTex转换立体屏幕空间纹理
参数1 (uv)uv
参数2 (w)w
注解转换立体屏幕空间纹理
float2 TransformStereoScreenSpaceTex(float2 uv, float w)
{
    // TODO: RVS support can be added here, if Universal decides to support it
    float4 scaleOffset = unity_StereoScaleOffset[unity_StereoEyeIndex];
    return uv.xy * scaleOffset.xy + scaleOffset.zw * w;
}

Top

UnityStereoTransformScreenSpaceTexUnity转换立体屏幕空间纹理
参数1 (uv)uv
注解Unity转换立体屏幕空间纹理,要开启 UNITY_SINGLE_PASS_STEREO 否则没实现。
float2 UnityStereoTransformScreenSpaceTex(float2 uv)
{
    return TransformStereoScreenSpaceTex(saturate(uv), 1.0);
}
  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值