ScriptableRenderPipeline 记录

RenderPipeline

class in UnityEngine.Rendering

定义一系列描述 Unity 如何渲染帧的命令和设置。

变量
disposed 当 RenderPipeline 无效或被销毁时,返回 true。

受保护的函数
Render 定义此渲染管线的自定义渲染。

静态函数
BeginCameraRendering 在摄像机渲染开始之前调用委托。只能在 SRP 渲染期间使用。
BeginFrameRendering 在摄像机渲染开始之前调用委托。只能在 SRP 渲染期间使用。
EndCameraRendering 在摄像机渲染结束之后调用委托。只能在 SRP 渲染期间使用。
EndFrameRendering 在摄像机渲染结束之后调用 SRP 渲染期间使用的委托。

ScriptableRenderContext

定义自定义渲染管线使用的状态和绘制命令。

定义自定义 RenderPipeline 时,可使用 ScriptableRenderContext 向 GPU 调度和提交状态更新和绘制命令。

RenderPipeline.Render 方法实现通常会针对每个摄像机剔除渲染管线不需要渲染的对象(CullingResults),然后对 ScriptableRenderContext.DrawRenderers 发起一系列调用并混合 ScriptableRenderContext.ExecuteCommandBuffer 调用。这些调用会设置全局着色器属性、更改渲染目标、分发计算着色器和其他渲染任务。若要实际执行渲染循环,请调用 ScriptableRenderContext.Submit。

公共函数
BeginRenderPass 调度新渲染通道的开头。在任何时候只能有一个渲染通道处于活动状态。

BeginScopedRenderPass 调度新渲染通道的开头。如果在 using 语句中调用此内容,则 Unity 会在退出 using 代码块时自动调用 EndRenderPass。在任何时候只能有一个渲染通道处于活动状态。

BeginScopedSubPass 调度渲染通道中的新子通道的开头。如果在 using 语句调用此内容,则 Unity 会在退出 using 代码块时自动调用 EndSubPass。 渲染通道永远不能独立存在,必须始终包含至少一个子通道。在任何时候只能有一个子通道处于活动状态。

BeginSubPass 调度渲染通道中的新子通道的开头。渲染通道永远不能独立存在,必须始终包含至少一个子通道。在任何时候只能有一个子通道处于活动状态。
Cull 基于通常从当前渲染的摄像机获取的 ScriptableCullingParameters 来执行剔除。

DrawGizmos 为给定摄像机调度辅助图标的子集的绘制(在后期处理之前或之后)。

DrawRenderers 调度可见 GameObjects 的子通道的开头。

DrawShadows 为单个光源调度阴影投射物的绘制。

DrawSkybox 调度天空盒的绘制。

EndRenderPass 调度当前活动渲染通道的结尾。

EndSubPass 调度当前活动子通道的结尾。

ExecuteCommandBuffer 调度自定义图形命令缓冲区的执行。

ExecuteCommandBufferAsync 对异步计算队列调度命令缓冲区的执行。传入的

ComputeQueueType 会确定队列顺序。

InvokeOnRenderObjectCallback 为 MonoBehaviour 脚本调度 OnRenderObject 回调的调用。

SetupCameraProperties 调度特定于摄像机的全局着色器变量的设置。

StartMultiEye 对 ScriptableRenderContext 调度立体渲染的精细开头。

StereoEndRender 调度立体渲染在单个帧上的完成情况的通知。

StopMultiEye 对 ScriptableRenderContext 调度立体渲染的停止。

Submit 将所有调度命令都提交给渲染循环来执行。

静态函数
EmitWorldGeometryForSceneView 将 UI 几何形状发射到 Scene 视图以进行渲染。

CullingResults

struct in UnityEngine.Rendering

剔除结果(可见对象、光源、反射探针)。

在脚本化渲染循环中,渲染过程通常会对每个摄像机进行剔除 (ScriptableRenderContext.Cull),然后渲染可见对象 (ScriptableRenderContext.DrawRenderers) 的子集并处理可见光源(visibleLights、visibleReflectionProbes)。

CullingResults 还提供了一些可辅助阴影渲染的函数(ComputeDirectionalShadowMatricesAndCullingPrimitives、ComputeSpotShadowMatricesAndCullingPrimitives、ComputePointShadowMatricesAndCullingPrimitives)。

变量
lightAndReflectionProbeIndexCount 获取每个对象的光源和反射探针的索引数。

lightIndexCount 获取每个对象的光源索引数。

reflectionProbeIndexCount 获取每个对象的反射探针索引数。

visibleLights 可见光源的数组。

visibleOffscreenVertexLights 仍会影响可见场景顶点的屏幕外光源。

visibleReflectionProbes 可见反射探针的数组。

公共函数
ComputeDirectionalShadowMatricesAndCullingPrimitives 计算方向光的视图和投影矩阵以及阴影分割数据。

ComputePointShadowMatricesAndCullingPrimitives 计算点光源的视图和投影矩阵以及阴影分割数据。

ComputeSpotShadowMatricesAndCullingPrimitives 计算聚光灯的视图和投影矩阵以及阴影分割数据。

FillLightAndReflectionProbeIndices 使用每个对象的光源索引填充计算缓冲区。

GetLightIndexMap 如果 RenderPipeline 对 VisibleLight 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的光源列表。

GetReflectionProbeIndexMap 如果 RenderPipeline 对 VisibleReflectionProbe 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的反射探针列表。

GetShadowCasterBounds 返回封装了可见阴影投射物的包围盒。例如,这可用于动态调整级联范围。

SetLightIndexMap 如果 RenderPipeline 对 VisibleLight 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的光源列表。 如果数组的某个元素被设置为 -1,则与该元素对应的光源将被禁用。

SetReflectionProbeIndexMap 如果 RenderPipeline 对 VisibleReflectionProbe 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的反射探针列表。 如果数组的某个元素被设置为 -1,则与该元素对应的反射探针将被禁用。

CommandBuffer

CommandBuffer 保存渲染命令列表(例如设置渲染目标或绘制给定网格)。您可以指示 Unity 在内置渲染管线中的各个点安排和执行这些命令,因此,您可以自定义和扩展 Unity 的渲染功能。
可以使用 Graphics.ExecuteCommandBuffer API 立即执行 CommandBuffer,也可以进行安排,让它们在渲染管线中的给定点执行。要安排它们,请使用 Camera.AddCommandBuffer API 与CameraEvent 枚举,以及 Light.AddCommandBuffer API 与 LightEvent 枚举。要查看 Unity 何时执行以这种方式安排的 CommandBuffer,请参阅 CameraEvent 和 LightEvent 的执行顺序。

命令缓冲区可保存渲染命令列表(“设置渲染目标、绘制网格等等”)。可将渲染命令设置为在摄像机渲染(请参阅 Camera.AddCommandBuffer)、光源渲染期间的各个点执行,或者立即执行

命令缓冲区创建后,可根据需要多次执行。

变量
name 此命令缓冲区的名称。

sizeInBytes 此命令缓冲区的大小,以字节为单位(只读)。

构造函数
CommandBuffer 创建新的空命令缓冲区。

公共函数
BeginSample 添加命令,以开始对配置文件进行采样。

Blit 添加“对渲染纹理执行 blit 操作”命令。

BuildRayTracingAccelerationStructure Adds a command to build the RayTracingAccelerationStructure to be used in a ray tracing dispatch.

Clear 清除缓冲区中的所有命令。

ClearRandomWriteTargets 为 Shader Model 4.5 级别的像素着色器清除随机写入目标。

ClearRenderTarget 添加“清除渲染目标”命令。

ConvertTexture 转换源纹理并将其复制到具有不同格式或尺寸的目标纹理。

CopyBuffer Adds a command to copy the contents of one GraphicsBuffer into another.

CopyCounterValue Adds a command to copy ComputeBuffer or GraphicsBuffer counter value.
CopyTexture 添加用于将纹理复制到其他纹理中的命令。

CreateAsyncGraphicsFence 用于调用 GommandBuffer.CreateGraphicsFence 的快捷方式,将 GraphicsFenceType.AsyncQueueSynchronization 作为第一个参数。

CreateGraphicsFence 创建一个 GraphicsFence,其传递时机是此调用前,GPU 中完成的最后一个 Blit、Clear、Draw、

Dispatch 或 Texture Copy 命令之后。

DisableKeyword Adds a command to disable a global or local shader keyword.

DisableScissorRect 添加用于禁用硬件剪辑矩形的命令。

DisableShaderKeyword Adds a command to disable a global shader keyword with a given name.

DispatchCompute 添加用于执行 ComputeShader 的命令。

DispatchRays Adds a command to execute a RayTracingShader.

DrawMesh 添加“绘制网格”命令。

DrawMeshInstanced Adds a “draw mesh with instancing” command.如果 Material.enableInstancing 为 false,该命令不会立即失败并抛出异常,但如果检测到此类情况,则会记录错误并在每次执行命令时跳过渲染。如果当前平台不支持此 API(即,如果 GPU 实例化不可用),则会抛出 InvalidOperationException。请参阅 SystemInfo.supportsInstancing。

DrawMeshInstancedIndirect 添加“通过间接实例化绘制网格”命令。

DrawMeshInstancedProcedural 添加“通过实例化绘制网格”命令。Draw a mesh using Procedural Instancing. This is similar to Graphics.DrawMeshInstancedIndirect, except that when the instance count is known from script, it can be supplied directly using this method, rather than via a ComputeBuffer. If Material.enableInstancing is false, the command logs an error and skips rendering each time the command is executed; the command does not immediately fail and throw an exception.InvalidOperationException will be thrown if the current platform doesn’t support this API (for example, if GPU instancing is not available). See SystemInfo.supportsInstancing.

DrawOcclusionMesh 向 commandbuffer 添加命令以向当前渲染目标绘制 VR 设备的遮挡网格。

DrawProcedural 添加“绘制程序化几何体”命令。

DrawProceduralIndirect 添加“绘制程序化几何体”命令。

DrawRenderer 添加“绘制渲染器”命令。

DrawRendererList Adds a “draw renderer list” command.

EnableKeyword Adds a command to enable a global or local shader keyword.

EnableScissorRect 添加用于启用硬件剪辑矩形的命令。

EnableShaderKeyword Adds a command to enable a global keyword with a given name.

EndSample Adds a command to end profile sampling.

GenerateMips 生成渲染纹理的多级渐进纹理级别。

GetTemporaryRT 添加“获取临时渲染纹理”命令。

GetTemporaryRTArray 添加“获取临时渲染纹理阵列”命令。

IncrementUpdateCount 递增纹理的 updateCount 属性。

IssuePluginCustomBlit 向本机代码插件发送用户定义的 blit 事件。

IssuePluginCustomTextureUpdateV2 向本机代码插件发送纹理更新事件。

IssuePluginEvent 向本机代码插件发送用户定义的事件。

IssuePluginEventAndData 向本机代码插件发送具有自定义数据的用户定义的事件。

MarkLateLatchMatrixShaderPropertyID Mark a global shader property id to be late latched. Possible shader properties

include view, inverseView, viewProjection, and inverseViewProjection matrices. The Universal Render Pipeline (URP) uses this function to support late latching of shader properties. If you call this function when using built-in Unity rendering or the High-Definition Rendering Pipeline (HDRP), the results are ignored.

ReleaseTemporaryRT 添加“释放临时渲染纹理”命令。

RequestAsyncReadback 向命令缓冲区添加异步 GPU 回读请求命令。

RequestAsyncReadbackIntoNativeArray 向命令缓冲区添加异步 GPU 回读请求命令。

RequestAsyncReadbackIntoNativeSlice 向命令缓冲区添加异步 GPU 回读请求命令。

ResolveAntiAliasedSurface 强制解析抗锯齿渲染纹理。

SetBufferCounterValue Adds a command to set the counter value of append/consume buffer.

SetBufferData Adds a command to set the buffer with values from an array.

SetComputeBufferParam 添加用于在 ComputeShader 中设置输入或输出缓冲区参数的命令。

SetComputeConstantBufferParam Adds a command to set a constant buffer on a ComputeShader.

SetComputeFloatParam 添加用于在 ComputeShader 中设置浮点参数的命令。

SetComputeFloatParams 添加用于在 ComputeShader 中设置多个连续浮点参数的命令。

SetComputeIntParam 添加用于在 ComputeShader 中设置整数参数的命令。

SetComputeIntParams 添加用于在 ComputeShader 中设置多个连续整数参数的命令。

SetComputeMatrixArrayParam 添加用于在 ComputeShader 中设置矩阵数组参数的命令。

SetComputeMatrixParam 添加用于在 ComputeShader 中设置矩阵参数的命令。

SetComputeTextureParam 添加用于在 ComputeShader 中设置纹理参数的命令。

SetComputeVectorArrayParam 添加用于在 ComputeShader 中设置向量数组参数的命令。

SetComputeVectorParam 添加用于在 ComputeShader 中设置向量参数的命令。

SetExecutionFlags 设置标志,描述有关如何执行命令缓冲区的意图。

SetGlobalBuffer 添加“设置全局着色器缓冲区属性”命令。

SetGlobalColor 添加“设置全局着色器颜色属性”命令。

SetGlobalConstantBuffer 添加用于绑定全局常量缓冲区的命令。

SetGlobalDepthBias Adds a command to set the global depth bias.

SetGlobalFloat 添加“设置全局着色器浮点属性”命令。

SetGlobalFloatArray 添加“设置全局着色器浮点数组属性”命令。

SetGlobalInt Adds a command to set the value of a given property for all Shaders, where the property has a type of Int in ShaderLab code.

SetGlobalInteger Adds a command to set the value of a given property for all Shaders, where the property is an integer.

SetGlobalMatrix 添加“设置全局着色器矩阵属性”命令。

SetGlobalMatrixArray 添加“设置全局着色器矩阵数组属性”命令。

SetGlobalTexture 添加“设置全局着色器纹理属性”命令(引用 RenderTexture)。

SetGlobalVector 添加“设置全局着色器向量属性”命令。

SetGlobalVectorArray 添加“设置全局着色器向量数组属性”命令。

SetInstanceMultiplier 添加用于将每个绘制调用的实例数乘以特定乘数的命令。

SetInvertCulling 向缓冲区添加“设置反转剔除”命令。

SetKeyword Adds a command to set the state of a global or local shader keyword.

SetLateLatchProjectionMatrices Set the current stereo projection matrices for late latching. Stereo matrices is passed in as an array of two matrices.

SetProjectionMatrix 添加用于设置投影矩阵的命令。

SetRandomWriteTarget 为 Shader Model 4.5 级别的像素着色器设置随机写入目标。

SetRayTracingAccelerationStructure 添加命令以设置要与 RayTracingShader 一起使用的 RayTracingAccelerationStructure。

SetRayTracingBufferParam Adds a command to set an input or output buffer parameter on a RayTracingShader.

SetRayTracingConstantBufferParam Adds a command to set a constant buffer on a RayTracingShader.

SetRayTracingFloatParam 添加用于在 RayTracingShader 中设置浮点参数的命令。

SetRayTracingFloatParams 添加用于在 RayTracingShader 中设置多个连续浮点参数的命令。

SetRayTracingIntParam 添加用于在 RayTracingShader 中设置整数参数的命令。

SetRayTracingIntParams 添加用于在 RayTracingShader 中设置多个连续整数参数的命令。

SetRayTracingMatrixArrayParam 添加用于在 RayTracingShader 中设置矩阵数组参数的命令。

SetRayTracingMatrixParam 添加用于在 RayTracingShader 中设置矩阵参数的命令。

SetRayTracingShaderPass Adds a command to select which Shader Pass to use when executing ray/geometry intersection shaders.

SetRayTracingTextureParam 添加用于在 RayTracingShader 中设置纹理参数的命令。

SetRayTracingVectorArrayParam 添加用于在 RayTracingShader 中设置矢量数组参数的命令。

SetRayTracingVectorParam 添加用于在 RayTracingShader 中设置矢量参数的命令。

SetRenderTarget 添加“设置活动的渲染目标”命令。

SetShadowSamplingMode 添加“设置阴影采样模式”命令。

SetSinglePassStereo 添加用于为摄像机设置单通道立体模式的命令。

SetViewMatrix 添加用于设置视图矩阵的命令。

SetViewport 添加用于设置渲染视口的命令。

SetViewProjectionMatrices 添加用于设置视图和投影矩阵的命令。
UnmarkLateLatchMatrix Unmark a global shader property for late latching. After unmarking, the shader property will no longer be late latched. This function is intended for the Universal Render Pipeline (URP) to specify late latched shader properties.

WaitAllAsyncReadbackRequests 向 CommandBuffer 添加“AsyncGPUReadback.WaitAllRequests”命令。

WaitOnAsyncGraphicsFence 指示 GPU 等待,直至给定的 GraphicsFence 完成传递。

FrameBuffer

每一帧缓冲区包括写入颜色缓冲区(Color Buffer)深度缓冲区(Depth Buffer)丢弃模板缓冲区(Stencil Buffer)及自定义缓冲区

写入缓冲区之前会做一系列测试(模板测试、深度测试、alpha测试等)

TryGetCullingParameters

public bool TryGetCullingParameters (out Rendering.ScriptableCullingParameters cullingParameters);

public bool TryGetCullingParameters (bool stereoAware, out Rendering.ScriptableCullingParameters cullingParameters);

参数
cullingParameters 生成的剔除参数。

stereoAware 生成单通道立体声的感知剔除参数。

返回
bool 指示剔除参数是否有效的标志。

描述
获取摄像机的剔除参数。

如果要渲染的摄像机无效(视口矩形为空、裁剪面设置无效等),则返回 false。

当 stereoAware 为 true 且单通道立体声已启用时,在生成的剔除参数中考虑左右立体视线。

CullingResults

描述
剔除结果(可见对象、光源、反射探针)。

在脚本化渲染循环中,渲染过程通常会对每个摄像机进行剔除 (ScriptableRenderContext.Cull),然后渲染可见对象 (ScriptableRenderContext.DrawRenderers) 的子集并处理可见光源(visibleLights、visibleReflectionProbes)。

CullingResults 还提供了一些可辅助阴影渲染的函数(ComputeDirectionalShadowMatricesAndCullingPrimitives、ComputeSpotShadowMatricesAndCullingPrimitives、ComputePointShadowMatricesAndCullingPrimitives)。

变量
lightAndReflectionProbeIndexCount 获取每个对象的光源和反射探针的索引数。

lightIndexCount 获取每个对象的光源索引数。

reflectionProbeIndexCount 获取每个对象的反射探针索引数。

visibleLights 可见光源的数组。

visibleOffscreenVertexLights 仍会影响可见场景顶点的屏幕外光源。

visibleReflectionProbes 可见反射探针的数组。

公共函数
ComputeDirectionalShadowMatricesAndCullingPrimitives 计算方向光的视图和投影矩阵以及阴影分割数据。

ComputePointShadowMatricesAndCullingPrimitives 计算点光源的视图和投影矩阵以及阴影分割数据。

ComputeSpotShadowMatricesAndCullingPrimitives 计算聚光灯的视图和投影矩阵以及阴影分割数据。

FillLightAndReflectionProbeIndices 使用每个对象的光源索引填充计算缓冲区。

GetLightIndexMap 如果 RenderPipeline 对 VisibleLight 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的光源列表。

GetReflectionProbeIndexMap 如果 RenderPipeline 对 VisibleReflectionProbe 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的反射探针列表。

GetShadowCasterBounds 返回封装了可见阴影投射物的包围盒。例如,这可用于动态调整级联范围。

SetLightIndexMap 如果 RenderPipeline 对 VisibleLight 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的光源列表。 如果数组的某个元素被设置为 -1,则与该元素对应的光源将被禁用。

SetReflectionProbeIndexMap 如果 RenderPipeline 对 VisibleReflectionProbe 列表进行排序或以其他方式进行修改,则需要重新映射索引,以正确使用每个对象的反射探针列表。 如果数组的某个元素被设置为 -1,则与该元素对应的反射探针将被禁用。

DrawingSettings

描述
ScriptableRenderContext.DrawRenderers 的设置。

静态变量
maxShaderPasses 在 1 次 DrawRenderers 调用中可渲染的最大通道数。

变量
enableDynamicBatching 控制是否启用动态批处理。

enableInstancing 控制是否启用实例化。

mainLightIndex 配置应将什么光源用作主光源。

overrideMaterial 设置材质以用于将在此组中渲染的所有渲染器。

overrideMaterialPassIndex 选择要使用哪个覆盖材质通道。

perObjectData 要在渲染期间设置的每对象数据的类型。

sortingSettings 如何在渲染期间对对象进行排序。

构造函数
DrawingSettings 创建绘制设置结构。

公共函数
GetShaderPassName 获取此绘制调用可渲染的着色器通道。

SetShaderPassName 设置此绘制调用可渲染的着色器通道。

FilteringSettings

描述
ScriptableRenderContext.DrawRenderers 的过滤设置。

FilteringSettings 描述如何过滤给定的一组可见对象以便渲染。

静态变量
defaultValue 提供一组默认值,以使过滤不发生。

变量
excludeMotionVectorObjects 设置为 true 可以从渲染中排除当前处于运动状态的对象。默认值为 false。

layerMask 仅渲染给定层遮罩中的对象。

renderingLayerMask 在过滤可用渲染器以便绘制时使用的渲染层遮罩。

renderQueueRange 渲染其材质渲染器在此范围内排队的对象。

sortingLayerRange 渲染其排序图层在此范围内的对象。

构造函数
FilteringSettings 创建绘制设置结构。

ShaderTagId

struct in UnityEngine.Rendering

描述
着色器标签 ID 用于引用着色器中的各种名称。

静态变量
none 描述未引用任何名称的着色器标签 ID。

变量
name 获取着色器标签 ID 引用的标签的名称。

构造函数
ShaderTagId 获取或创建表示给定名称的着色器标签 ID。

运算符
Unknown operator Converts a string to a ShaderTagId.

SortingSettings

描述
此结构描述在渲染期间对对象排序的方法。

变量
cameraPosition 用于计算相对于对象的距离。

criteria 渲染时执行的排序类型。

customAxis 用于通过比较对象位置与此轴来计算相对于对象的距离。

distanceMetric 渲染时使用的排序类型。

worldToCameraMatrix 用于计算相对于对象的距离。

构造函数
SortingSettings 创建排序设置结构。

绘制物体顺序

无透明的物体 > 天空盒 > 透明物体
先绘制无透明物体是为了在绘制天空盒的时候经过深度测试避免再绘制过的区域像素重复绘制,而透明物体是不通过深度测试的,可以正常进行混合绘制。

DrawGizmo

描述
DrawGizmo 属性可用于为任意 Component 提供辅助图标渲染器。

渲染器函数必须是静态的,并且采用两个参数:一个是 绘制辅助图标所面向的对象,另一个是 GizmoType 参数,表示绘制辅助图标时所处的上下文。

渲染器函数可在任何类中定义,包括编辑器脚本。因此, 您可以将辅助图标绘制代码与组件脚本分离,从而 使其不会包含在构建中。

using UnityEngine;
using UnityEditor;

public class MyScript : MonoBehaviour
{
}

// The icon has to be stored in Assets/Gizmos

public class MyScriptGizmoDrawer
{
    [DrawGizmo(GizmoType.Selected | GizmoType.Active)]
    static void DrawGizmoForMyScript(MyScript scr, GizmoType gizmoType)
    {
        Vector3 position = scr.transform.position;

        if (Vector3.Distance(position, Camera.current.transform.position) > 10f)
            Gizmos.DrawIcon(position, "MyScript Gizmo.tiff");
    }
}

构造函数
DrawGizmo 定义应调用辅助图标以进行绘制的情况。

常见宏定义的转换矩阵

DrawCall & SetPassCall

DrawCall:在unity中,每次CPU准备数据并通知GPU的过程就称之为一个DrawCall。具体过程就是:设置颜色–>绘图方式–>顶点坐标–>绘制–>结束,所以在绘制过程中,如果能在一次DrawCall完成所有绘制就会大大提高运行效率,进而达到优化的目的。

SetPassCall:渲染 pass 的数量。每个 pass 都需要 Unity 运行时绑定一个新的着色器。

SetPassCall 耗时往往大于DrawCll耗时

Batch

只有在SRP管线支持的一种批处理方法,针对的是setpass的消耗,而不减少drawcall。

这个的优先级没查到明确的说明,在工程中,开启静态和动态批处理后,能看到SRP batcher,而静态的看不到了,看这效果应该是最高优先级。最核心的部分是把batch里面每个drawcall里小的CBUFFER组织成一个大的CBUFFER,然后统一上传到GPU。组合的前提是drawcall使用的shader相同,不支持不同变体。这样做的好处是一个设置渲染状态的指令,发送了更多数据,而且这些数据会在GPU有缓存,不改变时可以复用,不用每帧都发。unity底层降低了setpass的要求,只要shader的feature一样,贴图不同也不影响。SRP batcher后的drawcall,就变成了先判断cbuffer有没有改变,如果有改变,重新填充数据,然后调用多次drawcall,依次渲染使用这个shader的各种物体。要注意的是,CBUFFER保存的只是数据,因为在API底层,比如vulkan,支持的资源是缓冲区和贴图两种,unity也不能把贴图放到CBUFFER里。内部实现方式是PerObjectBuffer当一个shader确定的时候,这个shader使用了哪些feature就已经确定了,没有使用的feature不会填充PerObjectBuffer,也就是shader的feature越少,一次能合批的数量就会越多。填充完PerObjectBuffer后,就会把他们组成一个大的CBUFFER(PerObjectLargeBuffer),然后统一传到GPU做渲染。提速效果源于二个方面:一是各种属性值都会一直保留在GPU内存中,省去了上传和读取的消耗。二是专用代码会管理大型“per object” GPU CBUFFER,不过怎样管理的并没有详细说明。在Frame Debug可以看到一个batcher处理了多少drawcall,数量越多越高效。就像缓存都会遇到的那个问题一样,内存是有限的,如果大量使用,也可能显存不足,所以还是要有些选择,比如大量相似的小物体还是可以用GPU instance。

关于打断
条件大多是关于shader的,shader变体会导致重新设置渲染状态,所以官方有个建议是少用shader变体,而在CBuffer增加更多属性,增加属性并没有多少性能消耗。还有一个要注意的是MaterialBufferOverride,应该是超过了GPU可读取的贴图上限,这是硬件限制的。一般一个shader也不用采样太多贴图,消耗也比较大,可以合并一些通道。

静态批处理

这个使用起来很简单,完全交给美术做场景时选择,效果也很好,就是内存消耗比较大,还有个缺点是加载场景会变慢,因为在合mesh。原理是将静态物体集合成一个大的vbo提交(不考虑material是否相同),但只对要渲染的物体提交其ibo。代价是顶点数据结构按最复杂的存,组合这个vbo对CPU和显存有额外开销。针每个物体可以被单独剔除,通过设置ibo,也就是实际渲染时只会渲染可见物体,但是vbo是一直在内存中的,这也有个好处,就是打断drawcall的物体,也不需要上传vbo,少了上传消耗。

动态批处理

比静态批处理省内存,同时有一定的计算消耗。同时限制比较多,具体可以查看FrameDebug,针对问题进行优化。
原理是将物体动态组装成一个个稍大的vbo+ibo提交,mesh不必相同,material必须相同。

GPU Instancing

优先级比静态低,比动态高。对于一些大型多人的游戏,或是slg这种,还是种很实用的技术。
原理理解
针对的是mesh主要想法是GPU在一次遍历的时候会被告知多次来渲染相同的网格,所以网格只上传一份,每个物体引用这个网格,设置自己的矩阵,不限于小网格,不能合并不同的网格。只提交一个mesh,但是将多个使用同种mesh和material的物体的差异化信息组合成一个pio(per instanced attribute)提交。差异化信息保存位置、缩放、旋转、shader上的参数,不包括纹理在GPU,通过读取每个物体的pio数据,对同一个mesh进行各种变换后绘制主要限制是缓冲区,缓冲区大小决定了一个渲染批次中可以容纳多少个实例。

混合

在这里插入图片描述
渲染图形时,在执行所有着色器并应用所有纹理后,像素将写入到屏幕。这些像素与已有像素的组合方式由 Blend 命令控制。

语法
Blend Off:关闭混合(这是默认值)

Blend SrcFactor DstFactor:配置并启用混合。生成的颜色将乘以 SrcFactor。屏幕上的已有颜色乘以 DstFactor,然后将这两个值相加。

Blend SrcFactor DstFactor, SrcFactorA DstFactorA:同上,但使用不同系数来混合 Alpha 通道。

BlendOp Op:不将混合颜色相加,而是对它们执行不同的操作。

BlendOp OpColor, OpAlpha:同上,但是对颜色 (RGB) 通道和 Alpha (A) 通道使用不同的混合操作。

此外,您还可以设置上层渲染目标混合模式。当 使用多渲染目标 (MRT) 渲染时,上面的常规语法 将为所有渲染目标设置相同的混合模式。以下语法可以为各个渲染目标设置不同的混合模式,其中 N 是渲染目标索引(0 到 7)。此功能适用于大多数现代 API/GPU(DX11/12、GLCore、Metal 和 PS4):

Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor, OpAlpha
AlphaToMask On:开启 alpha-to-coverage。使用 MSAA 时,alpha-to-coverage 会根据像素着色器结果 Alpha 值按比例修改多重采样覆盖率遮罩。这通常用于比常规 Alpha 测试更少锯齿的轮廓;对植被和其他经过 Alpha 测试的着色器非常有用。

混合运算
可使用以下混合运算:

Add 将源和目标相加。
Sub 从源减去目标。
RevSub 从目标减去源。
Min 使用源和目标中的较小者。
Max 使用源和目标中的较大者。
LogicalClear 逻辑运算:清除 (0) 仅限 DX11.1。
LogicalSet 逻辑运算:设置 (1) 仅限 DX11.1。
LogicalCopy 逻辑运算:复制 (s) 仅限 DX11.1。
LogicalCopyInverted 逻辑运算:逆复制 (!s) 仅限 DX11.1。
LogicalNoop 逻辑运算:空操作 (d) 仅限 DX11.1。
LogicalInvert 逻辑运算:逆运算 (!d) 仅限 DX11.1。
LogicalAnd 逻辑运算:与 (s & d) 仅限 DX11.1。
LogicalNand 逻辑运算:与非 !(s & d) 仅限 DX11.1。
LogicalOr Logical operation: Or (s | d) DX11.1 only.
LogicalNor Logical operation: Nor !(s | d) DX11.1 only.
LogicalXor 逻辑运算:异或 (s ^ d) 仅限 DX11.1。
LogicalEquiv 逻辑运算:相等 !(s ^ d) 仅限 DX11.1。
LogicalAndReverse 逻辑运算:反转与 (s & !d) 仅限 DX11.1。
LogicalAndInverted 逻辑运算:逆与 (s & d) 仅限 DX11.1。
LogicalOrReverse Logical operation: Reverse Or (s | !d) DX11.1 only.
LogicalOrInverted Logical operation: Inverted Or (!s | d) DX11.1 only.
混合系数
以下所有属性对 Blend 命令中的 SrcFactor 和 DstFactor 都有效。源是指计算所得颜色,目标是指屏幕上已有的颜色。如果 BlendOp 在使用逻辑运算,则将忽略混合系数。

One 值为 1 - 让源或目标颜色通过。
Zero 值为 0 - 删除源或目标值。
SrcColor 此阶段的值乘以源颜色值。
SrcAlpha 此阶段的值乘以源 Alpha 值。
DstColor 此阶段的值乘以帧缓冲区源颜色值。
DstAlpha 此阶段的值乘以帧缓冲区源 Alpha 值。
OneMinusSrcColor 此阶段的值乘以(1 - 源颜色)。
OneMinusSrcAlpha 此阶段的值乘以(1 - 源 Alpha)。
OneMinusDstColor 此阶段的值乘以(1 - 目标颜色)。
OneMinusDstAlpha 此阶段的值乘以(1 - 目标 Alpha)。

详细信息
以下是最常见的混合类型:
Blend SrcAlpha OneMinusSrcAlpha // 传统透明度
Blend One OneMinusSrcAlpha // 预乘透明度
Blend One One // 加法
Blend OneMinusDstColor One // 软加法
Blend DstColor Zero // 乘法
Blend DstColor SrcColor // 2x 乘法

Alpha 混合、Alpha 测试和 alpha-to-coverage
为了绘制大多数完全不透明或完全透明的对象(其中透明度由纹理的 Alpha 通道定义,例如树叶、草、铁丝网等),通常使用几种方法:

Alpha 混合
在这里插入图片描述

这通常意味着对象必须被视为“半透明”,因而无法使用某些渲染功能(例如:延迟着色,无法接受阴影)。凹陷或重叠的 Alpha 混合对象通常也有绘制排序问题。

通常,Alpha 混合着色器还设置透明渲染队列,并关闭深度写入。因此,着色器代码如下所示:

// SubShader 内部
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }

// Pass 内部
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

Alpha 测试/镂空
在这里插入图片描述
通过在像素着色器中使用 clip() HLSL 指令,可以根据某些条件对像素进行“废弃”处理。这意味着对象仍然可以被视为完全不透明,并且没有绘制顺序问题。但是,这意味着所有像素都是完全不透明或透明的,导致锯齿(失真)。

通常,经过 alpha 测试的着色器还会设置镂空渲染队列,因此着色器代码如下所示:

// SubShader 内部
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }

// 片元着色器中的 CGPROGRAM 内部
clip(textureColor.a - alphaCutoffValue);

Alpha-to-coverage
在这里插入图片描述

当使用多重采样抗锯齿(MSAA,请参阅 QualitySettings)时,可通过使用 alpha-to-coverage GPU 功能来改进 Alpha 测试方法。根据使用的 MSAA 级别,这将改善边缘外观。

此功能最适合用于大多数不透明或透明的纹理,并且具有非常薄的“部分透明”区域(草、树叶和类似物)。

通常,alpha-to-coverage 着色器还会设置镂空渲染队列。因此,着色器代码如下所示:

// SubShader 内部
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }

// Pass 内部
AlphaToMask On

光照

灯光具备方向和颜色,其中灯光的方向代表的是光线的来源方向,而不是光线的照射方向。通过表面法线和光照方向进行点积,得到的结果乘以灯光的颜色来计算入射光照,当点积为负数的时候应当限制到0,通过saturate函数来实现

点积
a * b = |a| * |b| * cosθ
几何意义:

  1. a * b == 0,则 a ⊥ b
  2. a * b > 0,a b 同向
  3. a * b < 0,a b 异向
  4. 我们可以 normalize a 和 b,则 |a|,|b| 都为1,那么 cosθ = a*b,在知道 cosθ 的情况下,我们可以求知 a 在 b 上的投射长度 |a| * cosθ,b 在 a 上的投射长度 |b| * cosθ

叉积
a ^ b = |a| * |b| * sinθ * n (n 是根据右手法则得出的 a ^ b 方向上的单位向量,长度为1)
几何意义:

  1. a ^ b 的结果是一个向量,垂直于 a 和 b,方向由右手法则得出
  2. a ^ b != b ^ a,这是两个方向相反的平行向量
  3. |a ^ b| 是 a ^ b 向量的长度,同时也是 a 和 b 所形成的平行四边形的面积
  4. |a ^ b| == 0,则 a // b
  5. |a ^ b| = |a| * |b| * sinθ,所以当 normalize a 和 b 的时候,sinθ = |a ^ b|

saturate函数的基本原理是:一个色彩一个亮度值,把这个值以曲线的方式变大或变小,从而控制变化的范围,增强或减弱色彩的饱和度。

BRDF(双向反射分布函数)

BRDF(Bidirectional Reflectance Distribution Function,双向反射分布函数)是真实感图形学中最核心的概念之一,它描述的是物体表面将光能从任何一个入射方向反射到任何一个视点方向的反射特性,即入射光线经过某个表面反射后如何在各个出射方向上分布。BRDF模型是绝大多数图形学算法中用于描述光反射现象的基本模型。

经典光照模型
Lambert漫反射模型
Phong模型
Blinn-Phong模型
Ward BRDF模型

PBR光照模型

Cook-Torrance
Ward

变换矩阵

float4x4类型,且是列主序。
UNITY_MATRIX_MVP 当前模型 x 视图 x 投影矩阵
UNITY_MATRIX_MV 当前模型 x 视图矩阵
UNITY_MATRIX_V 当前视图矩阵
UNITY_MATRIX_P 当前投影矩阵
UNITY_MATRIX_VP 当前视图 x 投影矩阵
UNITY_MATRIX_T_MV 模型转置 x 视图矩阵
UNITY_MATRIX_IT_MV 模型逆转置 x 视图矩阵
unity_ObjectToWorld 当前模型矩阵
unity_WorldToObject 当前世界矩阵的逆矩阵

阴影

在渲染场景之前,标签为ShadowCaster的Pass会将可视化片元存储到一个缓冲区中(阴影贴图——Shadow Map),将每一个待输出片元进行计算深度值计算,如果深度值比阴影贴图离相机远的时候,表示该片元在阴影区域中。

阴影贴图的本质是一张深度图,他记录了从光源位置出发,到能看到的场景中距离他最近的表面位置(深度信息)。但是方向光并没有一个真实位置,要做的是找出与光的方向匹配的视图和投影矩阵,并给一个裁剪空间的立方体,该立方体与包含光源阴影的摄像机的可见区域重叠。这些数据可以通过CullingResults.ComputeDirectionalShadowMatricesAndCullingPrimitives 方法获取
CullingResults.ComputeDirectionalShadowMatricesAndCullingPrimitives

参数
activeLightIndex 编入活动光源数组的索引。
splitIndex 级联索引。
splitCount 级联的数量。
splitRatio 级联比率。
shadowResolution 阴影贴图的分辨率。
shadowNearPlaneOffset 光源的近平面偏移量。
viewMatrix 计算的视图矩阵。
projMatrix 计算的投影矩阵。
shadowSplitData 计算的级联数据。

返回
bool 如果为 false,则不需要在此帧中渲染此级联的阴影贴图。

描述
计算方向光的视图和投影矩阵以及阴影分割数据。

CSM( Cascaded Shaow Map)

对于阴影贴图越靠近相机,边缘锯齿化越严重,因为贴图的分辨率是固定的。由于阴影贴图使用的是正交投影,因此阴影贴图每个像素都是固定的世界空间大小)。如果使用透视相机,阴影越靠近相机,越容易产生多个片元从阴影贴图的同一个纹素进行采样的情况。当然使用高分辨率的阴影贴图可以锯齿的问题,但会占用更多的内存和带宽。
Cascaded Shadow Mapping可以很好的兼顾精度和性能的问题,它是利用分层的ShadowMap技术,实现大场景的阴影算法。它将视锥体进行从近到远的划分,为每个分片生成一张相同分辨率的光源空间下的深度图,再根据视线到物体之间的距离,决定该区域下使用哪张深度图进行深度比对,从而在不同区域下得到精度不同的阴影。在渲染大场景时就可以避免使用单张阴影贴图的各种缺点。
可以在工程的Project Setting -> Quality -> Shadows 中设置

slope scale based depth bias

在使用CSM 绘制阴影的时候会出现一个点的前后纹素会有一个光点距离差,这个偏差会导致两个纹素之间会被渲染成阴影,即使这是一个面。
那么slope scale based depth bias 算法改善了对阴影深度贴图的采样误差,核心思想是分析待绘制场景中各部分内容堆采样误差的影响程度。

法线偏差

在采样阴影时,使表面沿法线方向偏移一点,然后对一点进行采样,如果距离足够远就可以避免,这虽然会让阴影的位置发生稍微的改变,可能导致边缘不对齐或者假阴影。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity URP中,可以通过编写脚本来控制渲染流程。下面是一个简单的示例: ``` using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class MyRenderPipeline : ScriptableRenderPipeline { public override void Render(ScriptableRenderContext context, Camera[] cameras) { // 遍历所有相机 foreach (Camera camera in cameras) { // 创建一个渲染器上下文 var renderContext = new UniversalRenderContext(this, context); // 执行渲染命令 RenderSingleCamera(renderContext, camera); } } void RenderSingleCamera(UniversalRenderContext context, Camera camera) { // 执行一些自定义渲染操作,如设置渲染目标,清除缓冲区等等 // 执行通用渲染流程 base.Render(context, camera); // 执行一些额外的渲染操作,如后处理等等 } } ``` 在这个示例中,我们创建了一个名为`MyRenderPipeline`的类,继承自`ScriptableRenderPipeline`。我们重写了`Render`方法,该方法在每一帧中被调用,并且遍历所有相机,然后为每个相机执行`RenderSingleCamera`方法。 在`RenderSingleCamera`方法中,我们可以执行自定义的渲染操作,如设置渲染目标、清除缓冲区等等。然后,我们调用基类的`Render`方法,该方法执行通用的渲染流程。最后,我们可以再次执行一些额外的渲染操作,如后处理等等。 需要注意的是,这只是一个简单的示例,真正的渲染流程可能会更加复杂。在编写渲染代码时,您应该熟悉URP的渲染管线并了解如何使用它的各个阶段来控制渲染流程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱游戏开发的蝎子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值