版本:Unity 6 (6000.0)
语言:英语
从内置渲染管线中的着色器库导入文件
使用 GrabPass 命令获取当前帧缓冲区

在内置渲染管线中使用内置着色器函数

Unity 在 UnityCG.cginc 中提供了一些内置实用函数,旨在简化编写 着色器在 GPU 上运行的程序。 更多信息
参见 词汇表

转换位置

函数 描述
float4 UnityObjectToClipPos(float3 pos) 将一个点从物体空间转换到 摄像机一个组件,它会在你的场景中创建一个特定视角的图像。输出要么被绘制到屏幕上,要么被捕获为纹理。 更多信息
参见 词汇表
的裁剪空间,以齐次坐标表示。这相当于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0)),应该用它来代替。
float3 UnityObjectToViewPos(float3 pos) 将一个点从物体空间转换到视图空间。这相当于 mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz,应该用它来代替。

转换其他值

函数 描述
float3 WorldSpaceViewDir (float4 v) 从给定的物体空间顶点位置返回指向摄像机的世界空间方向(未归一化)。
float3 ObjSpaceViewDir (float4 v) 从给定的物体空间顶点位置返回指向摄像机的物体空间方向(未归一化)。
float2 ParallaxOffset (half h, half height, half3 viewDir) 计算视差法线贴图的 UV 偏移量。
fixed Luminance (fixed3 c) 将颜色转换为亮度(灰度)。
fixed3 DecodeLightmap (fixed4 color) 从 Unity 光照贴图一个预渲染的纹理,包含场景中静态物体上光源的影响。光照贴图叠加在场景几何体上,以模拟光照效果。 更多信息
参见 词汇表
(根据平台,使用 RGBM 或 dLDR)解码颜色。
float4 EncodeFloatRGBA (float v) 将 (0..1) 范围内的浮点数编码为 RGBA 颜色,用于存储在低精度渲染目标中。
float DecodeFloatRGBA (float4 enc) 将 RGBA 颜色解码为浮点数。
float2 EncodeFloatRG (float v) 将 (0..1) 范围内的浮点数编码为 float2。
float DecodeFloatRG (float2 enc) 解码之前编码的 RG 浮点数。
float2 EncodeViewNormalStereo (float3 n) 将视图空间法线编码为 0..1 范围内的两个数字。
float3 DecodeViewNormalStereo (float4 enc4) 从 enc4.xy 解码视图空间法线。

正向渲染辅助函数

这些函数仅在使用 正向渲染一个渲染路径,它根据影响物体的光源,在一个或多个通道中渲染每个物体。正向渲染对光源本身的处理方式也根据它们的设置和强度而有所不同。 更多信息
参见 词汇表
(ForwardBase 或 ForwardAdd 通道类型)时有用。

函数 描述
float3 WorldSpaceLightDir (float4 v) 计算指向光源的世界空间方向(未归一化),给定物体空间顶点位置。
float3 ObjSpaceLightDir (float4 v) 计算指向光源的物体空间方向(未归一化),给定物体空间顶点位置。
float3 Shade4PointLights (...) 计算来自四个点光源的照明,光源数据紧密地打包到向量中。正向渲染使用此方法计算每个顶点的照明。

屏幕空间辅助函数

以下函数是用于计算用于采样屏幕空间纹理的坐标的辅助函数。它们返回 float4,其中最终用于采样纹理的坐标可以通过透视除法计算(例如 xy/w)。

这些函数还处理 平台差异渲染纹理一种特殊的纹理类型,可以在运行时创建和更新。要使用它们,首先创建一个新的渲染纹理,然后指定一个摄像机渲染到其中。然后,你可以在材质中像使用普通纹理一样使用渲染纹理。 更多信息
参见 词汇表
坐标中的问题。

函数 描述
float4 ComputeScreenPos (float4 clipPos) 计算用于进行屏幕空间映射纹理采样的纹理坐标。输入是裁剪空间位置。
float4 ComputeGrabScreenPos (float4 clipPos) 计算用于采样 GrabPass 纹理的纹理坐标。输入是裁剪空间位置。

顶点照明辅助函数

这些函数仅在使用每个顶点照明着色器(“Vertex” 通道类型)时有用。

函数 描述
float3 ShadeVertexLights (float4 vertex, float3 normal) 计算来自四个每个顶点光源和环境光的照明,给定物体空间位置和法线。

阴影贴图宏

声明和采样阴影贴图在不同平台上可能会有很大差异。Unity 提供了几个宏来帮助解决这个问题。

用途
UNITY_DECLARE_SHADOWMAP(tex) 声明一个名为“tex”的阴影贴图纹理变量。
UNITY_SAMPLE_SHADOW(tex,uv) 在给定的“uv”坐标处采样阴影贴图纹理“tex”(XY 组件是纹理位置,Z 组件是与之比较的深度)。返回一个 0..1 范围内的阴影项单精度浮点数。
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) 与上面类似,但执行投影阴影贴图读取。“uv” 是一个 float4,所有其他组件都除以 .w 用于进行查找。

tex 的格式必须是 RenderTextureFormat.Shadowmap.

注意:并非所有显卡都支持阴影贴图。使用 SystemInfo.SupportsRenderTextureFormat 检查是否支持。

深度纹理辅助宏

大多数情况下,深度纹理用于从摄像机渲染深度。 UnityCG.cginc 包含文件 包含一些宏来处理这种情况下的复杂性。

  • COMPUTE_EYEDEPTH(i):计算顶点的眼空间深度,并将其输出到 o 中。当 渲染到深度纹理中时,在顶点程序中使用它。
  • DECODE_EYEDEPTH(i)/LinearEyeDepth(i):给定来自深度纹理 i 的高精度值,返回相应的眼空间深度。
  • Linear01Depth(i):给定来自深度纹理 i 的高精度值,返回 0 到 1 范围内相应的线性深度。
  • UNITY_TRANSFER_DEPTH(o):已弃用。计算顶点的眼空间深度,并将其输出到 o 中(必须是 float2)。在具有原生深度纹理的平台上,此宏不执行任何操作,因为 Z 缓冲区值会隐式渲染。
  • UNITY_OUTPUT_DEPTH(i):已弃用。从 i 返回眼空间深度(必须是 float2)。在具有原生深度纹理的平台上,此宏始终返回零,因为 Z 缓冲区值会隐式渲染。

注意:在 DX11/12 和 Metal 上,Z 缓冲区范围是 1–0,并且定义了 UNITY_REVERSED_Z。在其他平台上,范围是 0–1。

例如,此着色器将渲染其 游戏对象Unity 场景中的基本对象,可以代表角色、道具、场景、摄像机、航路点等等。游戏对象的功能由附加在其上的组件定义。 更多信息
参见 词汇表
的深度。

Shader "Render Depth" {
    SubShader {
        Tags { "RenderType"="Opaque" }
        Pass {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f {
                float4 pos : SV_POSITION;
                float2 depth : TEXCOORD0;
            };

            v2f vert (appdata_base v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                UNITY_TRANSFER_DEPTH(o.depth);
                return o;
            }

            half4 frag(v2f i) : SV_Target {
                UNITY_OUTPUT_DEPTH(i.depth);
            }
            ENDCG
        }
    }
}
从内置渲染管线中的着色器库导入文件
使用 GrabPass 命令获取当前帧缓冲区