当前位置:   article > 正文

Unity shader 整理笔记_sv_vertexid

sv_vertexid

着色器语义

UnityObjectToClipPos(vertex) 物体——裁剪空间

从片元着色器返回结构对于不止返回单个颜色的 着色器非常有用。
片元着色器 输出支持的其他语义如下。

SV_TargetN:多个渲染目标
    SV_Target1、SV_Target2 等等:这些是着色器写入的附加颜色。这在一次渲染到多个渲染目标(称为“多渲染目标”渲染技术,简称 MRT)时使用。SV_Target0 等同于 SV_Target。

SV_Depth:像素着色器深度输出

二、 顶点着色器输出和片元着色器输入

顶点着色器需要输出顶点的最终裁剪空间位置,此输出需要具有 SV_POSITION 语义,并为 float4 类型。

  • TEXCOORD0TEXCOORD1 等语义用于指示任意高精度数据,如纹理坐标和位置。
  • 顶点输出和片元输入的 COLOR0 和 COLOR1 语义用于低精度 0 到 1 范围的数据(如简单的颜色值)

三、 顶点着色器输出和片元着色器输入

        屏幕空间像素位置:VPOS

四、面对方向:VFACE

        片元着色器可以接收一种指示渲染表面是面向摄像机还是背对摄像机的变量

       return facing > 0 ?_ColorFront : _ColorBack;

五、顶点 ID:SV_VertexID

        顶点着色器可以接收具有“顶点编号”(为无符号整数)的变量。当您想要从纹理或 ComputeBuffers 中 获取额外的每顶点数据时,这非常有用。

        v2f vert ( float4 vertex : POSITION, // 顶点位置输入 uint vid : SV_VertexID // 顶点 ID,必须为 uint )

内置着色器 include 文件

Unity 中的着色器 include 文件采用 .cginc 扩展名,内置的着色器 include 文件包括:

  • HLSLSupport.cginc -_(自动包含)_用于跨平台着色器编译的 helper 宏和定义。
  • UnityShaderVariables.cginc -_(自动包含)_常用的全局变量。
  • UnityCG.cginc - 常用的 helper 函数
  • AutoLight.cginc - 光照和阴影功能,例如表面着色器在内部使用此文件。
  • Lighting.cginc - 标准表面着色器光照模型;当您编写表面着色器时会自动包含。
  • TerrainEngine.cginc - 地形和植被着色器的 helper 函数。

HLSLSupport.cginc

编译 CGPROGRAM 着色器时会自动包含此文件(但不会对 HLSLPROGRAM 着色器包含此文件)。此文件声明各种预处理器宏以帮助进行多平台着色器开发。

UnityShaderVariables.cginc

编译 CGPROGRAM 着色器时会自动包含此文件(但不会对 HLSLPROGRAM 着色器包含此文件)。此文件声明着色器中常用的各种内置全局变量

UnityCG.cginc

Shader 对象中通常会包含此文件。此文件声明大量内置 helper 函数和数据结构。

UnityCG.cginc 中的数据结构

  • struct appdata_base:顶点着色器输入,包含位置、法线和一个纹理坐标。
  • struct appdata_tan:顶点着色器输入,包含位置、法线、切线和一个纹理坐标。
  • struct appdata_full:顶点着色器输入,包含位置、法线、切线、顶点颜色和两个纹理坐标。
  • struct appdata_img: 顶点着色器输入,包含位置和一个纹理坐标。

UnityCG.cginc 中声明的函数

功能:描述:
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

UnityCG.cginc 中的通用 helper 函数

功能:描述:
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 解码视图空间法线。

UnityCG.cginc 中的前向渲染 helper 函数

仅当使用前向渲染(ForwardBase 或 ForwardAdd 通道类型)时,这些函数才有用。

功能:描述:
float3 WorldSpaceLightDir (float4 v)根据给定的对象空间顶点位置计算朝向光源的世界空间方向(未标准化)。
float3 ObjSpaceLightDir (float4 v)根据给定对象空间顶点位置计算朝向光源的对象空间方向(未标准化)。
float3 Shade4PointLights (...)计算四个点光源的光照,将光源数据紧密打包到矢量中。前向渲染使用它来计算每顶点光照。

UnityCG.cginc 中的屏幕空间 helper 函数

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

这些函数还处理渲染纹理坐标中的平台差异

功能:描述:
float4 ComputeScreenPos (float4 clipPos)计算用于执行屏幕空间贴图纹理采样的纹理坐标。输入是裁剪空间位置。
float4 ComputeGrabScreenPos (float4 clipPos)计算用于 GrabPass 纹理采样的纹理坐标。输入是裁剪空间位置。

UnityCG.cginc 中的顶点光照 helper 函数

仅当使用每顶点光照着色器(“Vertex”通道类型)时,这些函数才有用。

功能:描述:
float3 ShadeVertexLights (float4 vertex, float3 normal)根据给定的对象空间位置和法线计算四个每顶点光源和环境光的光照。

内置着色器变量

Unity 的内置文件包含着色器的全局变量:当前对象的变换矩阵、光源参数、当前时间等等。就像任何其他变量一样,可在着色器程序中使用这些变量,但如果已经包含相关的 include 文件,则不必声明这些变量。

变换

所有这些矩阵都是 float4x4 类型,并且是列主序的。

名称
UNITY_MATRIX_MVP当前模型 * 视图 * 投影矩阵。
UNITY_MATRIX_MV当前模型 * 视图矩阵。
UNITY_MATRIX_V当前视图矩阵。
UNITY_MATRIX_P当前投影矩阵。
UNITY_MATRIX_VP当前视图 * 投影矩阵。
UNITY_MATRIX_T_MV模型转置 * 视图矩阵。
UNITY_MATRIX_IT_MV模型逆转置 * 视图矩阵。
unity_ObjectToWorld当前模型矩阵。
unity_WorldToObject当前世界矩阵的逆矩阵。

摄像机和屏幕

这些变量将对应于正在渲染的摄像机。例如,在阴影贴图渲染中,它们仍将引用摄像机组件值,而不是用于阴影贴图投影的“虚拟摄像机”。

名称类型
_WorldSpaceCameraPosfloat3摄像机的世界空间位置。
_ProjectionParamsfloat4x 是 1.0(如果当前使用翻转投影矩阵进行渲染,则为 –1.0),y 是摄像机的近平面,z 是摄像机的远平面,w 是远平面的倒数。
_ScreenParamsfloat4x 是摄像机目标纹理的宽度(以像素为单位),y 是摄像机目标纹理的高度(以像素为单位),z 是 1.0 + 1.0/宽度,w 为 1.0 + 1.0/高度。
_ZBufferParamsfloat4用于线性化 Z 缓冲区值。x 是 (1-远/近),y 是 (远/近),z 是 (x/远),w 是 (y/远)。
unity_OrthoParamsfloat4x 是正交摄像机的宽度,y 是正交摄像机的高度,z 未使用,w 在摄像机为正交模式时是 1.0,而在摄像机为透视模式时是 0.0。
unity_CameraProjectionfloat4x4摄像机的投影矩阵。
unity_CameraInvProjectionfloat4x4摄像机投影矩阵的逆矩阵。
unity_CameraWorldClipPlanes[6]float4摄像机视锥体平面世界空间方程,按以下顺序:左、右、底、顶、近、远。

时间

时间以秒为单位,并由项目 Time 设置中的时间乘数 (Time multiplier) 进行缩放。没有内置变量可用于访问未缩放的时间。

名称类型
_Timefloat4自关卡加载以来的时间 (t/20, t, t*2, t*3),用于将着色器中的内容动画化。
_SinTimefloat4时间正弦:(t/8, t/4, t/2, t)。
_CosTimefloat4时间余弦:(t/8, t/4, t/2, t)。
unity_DeltaTimefloat4增量时间:(dt, 1/dt, smoothDt, 1/smoothDt)。

光照

光源参数以不同的方式传递给着色器,具体取决于使用哪个渲染路径, 以及着色器中使用哪种光源模式通道标签

前向渲染ForwardBase 和 ForwardAdd 通道类型):

名称类型
_LightColor0(在 UnityLightingCommon.cginc 中声明)fixed4光源颜色。
_WorldSpaceLightPos0float4方向光:(世界空间方向,0)。其他光源:(世界空间位置,1)。
unity_WorldToLight(在 AutoLight.cginc 中声明)float4x4世界/光源矩阵。用于对剪影和衰减纹理进行采样。
unity_4LightPosX0、unity_4LightPosY0、unity_4LightPosZ0float4(仅限 ForwardBase 通道)前四个非重要点光源的世界空间位置。
unity_4LightAtten0float4(仅限 ForwardBase 通道)前四个非重要点光源的衰减因子。
unity_LightColorhalf4[4](仅限 ForwardBase 通道)前四个非重要点光源的颜色。
unity_WorldToShadowfloat4x4[4]World-to-shadow matrices. One matrix for Spot Lights, up to four for directional light cascades.

延迟着色和延迟光照,在光照通道着色器中使用(全部在 UnityDeferredLibrary.cginc 中声明):

名称类型
_LightColorfloat4光源颜色。
unity_WorldToLightfloat4x4世界/光源矩阵。用于对剪影和衰减纹理进行采样。
unity_WorldToShadowfloat4x4[4]World-to-shadow matrices. One matrix for Spot Lights, up to four for directional light cascades.

为 ForwardBasePrePassFinal 和 Deferred 通道类型设置了球谐函数系数 (由环境光和光照探针使用)。这些系数包含由世界空间法线求值的三阶 SH 函数(请参阅 UnityCG.cginc 中的 ShadeSH9)。 这些变量都是 half4 类型、unity_SHAr 和类似名称。

顶点光照渲染Vertex 通道类型):

最多可为 Vertex 通道类型设置 8 个光源;始终从最亮的光源开始排序。因此,如果您希望 一次渲染受两个光源影响的对象,可直接采用数组中前两个条目。如果影响对象 的光源数量少于 8,则其余光源的颜色将设置为黑色。

名称类型
unity_LightColorhalf4[8]光源颜色。
unity_LightPositionfloat4[8]View-space light positions. (-direction,0) for directional lights; (position,1) for Point or Spot Lights.
unity_LightAttenhalf4[8]Light attenuation factors. x is cos(spotAngle/2) or –1 for non-Spot Lights; y is 1/cos(spotAngle/4) or 1 for non-Spot Lights; z is quadratic attenuation; w is squared light range.
unity_SpotDirectionfloat4[8]View-space Spot Lights positions; (0,0,1,0) for non-Spot Lights.

光照贴图

名称类型
unity_LightmapTexture2D包含光照贴图信息。
unity_LightmapSTfloat4[8]缩放 UV 信息并转换到正确的范围以对光照贴图纹理进行采样。

雾效和环境光

名称类型
unity_AmbientSkyfixed4梯度环境光照情况下的天空环境光照颜色。
unity_AmbientEquatorfixed4梯度环境光照情况下的赤道环境光照颜色。
unity_AmbientGroundfixed4梯度环境光照情况下的地面环境光照颜色。
UNITY_LIGHTMODEL_AMBIENTfixed4环境光照颜色(梯度环境情况下的天空颜色)。旧版变量。
unity_FogColorfixed4雾效颜色。
unity_FogParamsfloat4用于雾效计算的参数:(density / sqrt(ln(2))、density / ln(2)、–1/(end-start) 和 end/(end-start))。x 对于 Exp2 雾模式很有用;_y_ 对于 Exp 模式很有用,_z_ 和 w 对于 Linear 模式很有用。

其他

名称类型
unity_LODFadefloat4使用 LODGroup 时的细节级别淡入淡出。x 为淡入淡出(0 到 1),_y_ 为量化为 16 级的淡入淡出,_z_ 和 w 未使用。
_TextureSampleAddfloat4根据所使用的纹理是 Alpha8 格式(值设置为 (1,1,1,0))还是不是该格式(值设置为 (0,0,0,0))由 Unity 仅针对 UI 自动设置。

使用采样器状态

耦合的纹理和采样器

  1. sampler2D _MainTex;
  2. // ...
  3. half4 color = tex2D(_MainTex, uv);

使用 HLSL 关键字 sampler2D、sampler3D 和 samplerCUBE 可声明纹理和采样器。

大部分情况下,这是您想要的结果,而且在较旧的图形 API (OpenGL ES) 中,这是唯一受支持的选项。

单独的纹理和采样器

Many graphics APIs and GPUs allow using fewer samplers than textures, and coupled texture+sampler syntax might not allow more complex shaders to be written. For example, Direct3D 11 allows using up to 128 textures in a single shader, but only up to 16 samplers.

Unity 允许使用 DX11 风格的 HLSL 语法来声明纹理和采样器,但需要通过一个特殊的命名约定来让它们匹配:名称为“sampler”+TextureName 格式的采样器将从该纹理中获取采样状态。

以上部分中的着色器代码片段可以用 DX11 风格的 HLSL 语法重写,并且也会执行相同的操作:

  1. Texture2D _MainTex;
  2. SamplerState sampler_MainTex; //"sampler"+"_MainTex"
  3. // ...
  4. half4 color = _MainTex.Sample(sampler_MainTex, uv);

在下面的示例中,对三个纹理进行采样,但只有一个采样器用于所有纹理:

  1. Texture2D _MainTex;
  2. Texture2D _SecondTex;
  3. Texture2D _ThirdTex;
  4. SamplerState sampler_MainTex; //"sampler"+"_MainTex"
  5. // ...
  6. half4 color = _MainTex.Sample(sampler_MainTex, uv);
  7. color += _SecondTex.Sample(sampler_MainTex, uv);
  8. color += _ThirdTex.Sample(sampler_MainTex, uv);

以上代码将在 Unity 支持的所有平台上进行编译,但会在 DX9 等旧平台上回退到使用三个采样器。

内联采样器状态

除了能识别名为“sampler”+TextureName 的 HLSL SamplerState 对象,Unity 还能识别采样器名称中的某些其他模式。这对于直接在着色器中声明简单硬编码采样状态很有用。例如:

  1. Texture2D _MainTex;
  2. SamplerState my_point_clamp_sampler;
  3. // ...
  4. half4 color = _MainTex.Sample(my_point_clamp_sampler, uv);
* 可根据每个轴 (UVW) 来指定包裹模式,例如"ClampU_RepeatV"

Using materials with C# scripts

这允许您在游戏过程中修改材质上的数值、更改颜色和动态交换纹理。为此,最常用的一些函数是:

函数名称用途
SetColor更改材质的颜色(例如反照率着色颜色)
SetFloat设置浮点值(例如,法线贴图乘数)
SetInt在材质中设置整数值
SetTexture为材质分配新纹理

完整的材质处理函数列表

Material

class in UnityEngine

继承自:Object

变量

color材质的主色。
doubleSidedGI获取和设置是否为此材质启用双面全局光照设置。
enabledKeywordsAn array containing the local shader keywords that are currently enabled for this material.
enableInstancing获取和设置是否为此材质启用 GPU 实例化。
globalIlluminationFlags定义材质应如何与光照贴图和光照探针交互。
mainTexture主纹理。
mainTextureOffset主纹理的偏移。
mainTextureScale主纹理的缩放。
passCount此材质中的通道数(只读)。
renderQueue此材质的渲染队列。
shader材质使用的着色器。
shaderKeywordsAn array containing names of the local shader keywords that are currently enabled for this material.

构造函数

公共函数

ComputeCRC从材质的内容计算 CRC 哈希值。
CopyPropertiesFromMaterial将属性从其他材质复制到此材质中。
DisableKeywordDisables a local shader keyword for this material.
EnableKeywordEnables a local shader keyword for this material.
FindPass返回通道 passName 的索引。
GetColor获取指定的颜色值。
GetColorArray获取指定的颜色数组。
GetFloat获取指定的浮点值。
GetFloatArray获取指定的浮点数组。
GetIntThis method is deprecated. Use GetFloat or GetInteger instead.
GetInteger获取指定的整数值。
GetMatrix从着色器获取指定的矩阵值。
GetMatrixArray获取指定的矩阵数组。
GetPassName返回索引 pass 处的着色器通道的名称。
GetShaderPassEnabled检查此材质上是否启用了给定的着色器通道。
GetTag获取材质着色器标记的值。
GetTexture获取指定的纹理。
GetTextureOffset获取纹理 propertyName 的位置偏移。
GetTexturePropertyNameIDs返回此材质上公开的所有纹理属性的名称 ID。
GetTexturePropertyNames返回此材质上公开的所有纹理属性的名称。
GetTextureScale获取纹理 propertyName 的位置缩放。
GetVector获取指定的向量值。
GetVectorArray获取指定的向量数组。
HasBufferChecks if the ShaderLab file assigned to the Material has a ComputeBuffer property with the given name.
HasColorChecks if the ShaderLab file assigned to the Material has a Color property with the given name.
HasConstantBufferChecks if the ShaderLab file assigned to the Material has a ConstantBuffer property with the given name.
HasFloatChecks if the ShaderLab file assigned to the Material has a Float property with the given name. This also works with the Float Array property.
HasIntThis method is deprecated. Use HasFloat or HasInteger instead.
HasIntegerChecks if the ShaderLab file assigned to the Material has an Integer property with the given name.
HasMatrixChecks if the ShaderLab file assigned to the Material has a Matrix property with the given name. This also works with the Matrix Array property.
HasPropertyChecks if the ShaderLab file assigned to the Material has a property with the given name.
HasTextureChecks if the ShaderLab file assigned to the Material has a Texture property with the given name.
HasVectorChecks if the ShaderLab file assigned to the Material has a Vector property with the given name. This also works with the Vector Array property.
IsKeywordEnabledChecks whether a local shader keyword is enabled for this material.
Lerp在两个材质之间对属性进行插值。
SetBufferSets a named buffer value.
SetColor设置指定的颜色值。
SetColorArray设置颜色数组属性。
SetConstantBufferSets a ComputeBuffer or GraphicsBuffer as a named constant buffer for the material.
SetFloat设置指定的浮点值。
SetFloatArray设置浮点数组属性。
SetIntThis method is deprecated. Use SetFloat or SetInteger instead.
SetInteger设置指定的整数值。
SetKeywordSets the state of a local shader keyword for this material.
SetMatrix为着色器设置指定的矩阵。
SetMatrixArray设置矩阵数组属性。
SetOverrideTag对材质设置重写标记/值。
SetPass激活给定的 pass 以进行渲染。
SetShaderPassEnabled在每个材质级别上启用或禁用着色器通道。
SetTexture设置指定的纹理。
SetTextureOffset设置纹理 propertyName 的位置偏移。
SetTextureScale设置纹理 propertyName 的位置缩放。
SetVector设置指定的向量值。
SetVectorArray设置向量数组属性。

继承的成员

变量

hideFlags该对象应该隐藏、随场景一起保存还是由用户修改?
name对象的名称。

公共函数

GetInstanceIDGets the instance ID of the object.
ToString返回对象的名称。

静态函数

Destroy移除 GameObject、组件或资源。
DestroyImmediate立即销毁对象 /obj/。强烈建议您改用 Destroy。
DontDestroyOnLoad在加载新的 Scene 时,请勿销毁 Object。
FindObjectOfType返回第一个类型为 type 的已加载的激活对象。
FindObjectsOfTypeGets a list of all loaded objects of Type type.
Instantiate克隆 original 对象并返回克隆对象。

运算符

bool该对象是否存在?
operator !=比较两个对象是否引用不同的对象。
operator ==比较两个对象引用,判断它们是否引用同一个对象。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/108326
推荐阅读
相关标签
  

闽ICP备14008679号