包含此页的版本:
不含此页的版本:
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) 范围 float 编码为 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).
这些功能还处理了渲染纹理(render texture) 一种特殊类型的纹理,在运行时创建和更新。要使用它们,请先创建一个新的渲染纹理,并指定要渲染到其中的摄像机之一。然后,你可以在材质中使用渲染纹理,就像使用常规纹理一样。更多信息
请参阅术语表坐标。
| 功能: | 描述: |
|---|---|
float4 ComputeScreenPos (float4 clipPos) |
计算纹理坐标以执行屏幕空间映射纹理示例。输入是裁剪空间位置。 |
float4 ComputeGrabScreenPos (float4 clipPos) |
计算纹理坐标,以对 GrabPass 纹理进行采样。输入是裁剪空间位置。 |
这些函数仅在使用每个顶点光照着色器(“顶点”通道类型)时才有用。
| 功能: | 描述: |
|---|---|
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 包含一些宏来处理上述复杂性:
注意:在 DX11/12 和 Metal 上,Z 缓冲区范围为 1–0,并定义了 UNITY_REVERSED_Z。在其他平台上,范围为 0-1。
例如,此着色器将呈现其游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表:
Shader "Render Depth" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
HLSLPROGRAM
#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);
}
ENDHLSL
}
}
}