96SEO 2026-02-19 10:49 0
SetRenderTarget(4)CommandBuffer.Blit(5)填充Shader变量数据(6)绘制(7)转换纹理格式

(2021.3版本)常用函数方法context.Cullcontext.DrawGizmoscontext.DrawRenderersvoid
Rendering.ShadowDrawingSettings
camera);context.DrawWireOverlay(camera);context.ExecuteCommandBuffer(cmd);context.SetupCameraProperties(camera);context.Submit();if
(!context.SubmitForRenderPassValidation()){...}其他
命令缓冲区保存渲染命令列表(“设置渲染目标绘制网格…”)。
它们可以设置为在相机渲染(参见camera
addcommandbuffer)或立即执行(参见Graphics.ExecuteCommandBuffer)期间的不同处执行。
通常情况下它们会以自定义方式扩展Unity的渲染管道。
例如您可以在完成所有常规对象之后将一些附加对象渲染到延迟渲染G-buffer中或者对光影贴图进行自定义处理。
有关详细信息请参阅
如果需要可以创建命令缓冲区然后多次执行。
也就是说一般使用完毕后需要手动清除缓存如果命令是Loop的则可以循环执行
[NativeType(Runtime/Graphics/CommandBuffer/RenderingCommandBuffer.h)]
[NativeHeader(Runtime/Shaders/ComputeShader.h)]
[NativeHeader(Runtime/Shaders/RayTracingShader.h)]
[NativeHeader(Runtime/Export/Graphics/RenderingCommandBuffer.bindings.h)]
SetBufferCounterValue(GraphicsBuffer
CommandBuffer.GetTemporaryRT获取临时渲染纹理
Shader.PropertyToID(_FrameBuffer);
//纹理过滤模式(默认为Point)。
还有Bilinear、TrilinearRenderTextureFormat
//RenderTexture的格式。
(常用有ARGB32(Default)、Depth、Shadowmap、...)RenderTextureReadWrite
enableRandomWrite);//是否应该启用对纹理的随机写入访问(默认为false)。
使用ReleaseTemporaryRT释放临时渲染纹理传递相同的nameID。
任何没有明确释放的临时纹理将在相机完成渲染时或在Graphics.ExecuteCommandBuffer结束后被删除。
获得临时渲染纹理后您可以将其设置为活动(SetRenderTarget)或
it。
在命令缓冲区执行期间您不需要显式地保留活动渲染目标(当前渲染目标将在之后保存和恢复)。
如果使用Gamma色彩空间RenderTextureReadWrite
如果使用Linear色彩空间默认输入为sRGBfragment输出为线性空间颜色。
当渲染到texture时fragment输出转化为sRGB空间。
当在Shader中采样纹理sRGB色彩空间会自动转为线性空间。
Linear然而如果你的渲染纹理包含非颜色数据(法线速度其他自定义值)那么你不希望Linear-sRGB转换发生。
当纹理类型为
formats、Depth、Shadowmap则无论readWrite设为什么都会使用线性空间。
我们可以通过RenderTexture.sRGB了解渲染纹理使用sRGB或是Linear。
如果为sRGB返回true如果为Linear返回false。
SetRenderTarget(Rendering.RenderTargetIdentifier
//渲染目标设置为颜色缓冲。
Rendering.RenderBufferLoadAction
//用于颜色的加载操作。
Rendering.RenderBufferStoreAction
//用于颜色的存储操作。
Rendering.RenderTargetIdentifier
//将渲染目标设置为深度缓冲区。
Rendering.RenderBufferLoadAction
//用于深度/模板缓冲区的加载操作。
Rendering.RenderBufferStoreAction
depthStoreAction);//用于深度/模板缓冲区的存储操作
SetRenderTarget(RenderTargetIdentifier[]
多重纹理渲染DBufferRendering.RenderTargetIdentifier
//要设置的3D或阵列渲染目标的层。
渲染纹理可以用几种方式表示:一个RenderTexture对象一个用GetTemporaryRT创建的临时渲染纹理或者一个内置的临时纹理(BuiltinRenderTextureType)。
所有这些都由RenderTargetIdentifier结构体表示该结构体具有隐式转换操作符以节省输入。
Rendering.RenderBufferLoadAction
当GPU开始渲染到渲染目标时此设置指定应该在表面的现有内容上执行的操作。
如果加载动作是Clear或not
GPUs可能会获得性能优势。
用户应该避免使用RenderBufferLoadAction。
尽可能Load
请注意并非所有平台都有加载/存储操作因此此设置可能在运行时被忽略。
通常面向移动设备的图形api
如果你使用RenderBufferLoadAction.DontCare渲染可能会失败或产生伪影因为深度纹理中未定义的像素会导致深度测试失败。
你可以使用LoadStoreActionDebugModeSettings
Load:当这个RenderBuffer被激活时保留它的现有内容。
这种设置在基于tile的gpu上很昂贵应该尽可能避免。
Clear激活渲染缓冲区后清除其内容。
目前只能与RenderPass
API一起工作。
DontCare当这个RenderBuffer被激活时GPU被指示不关心RenderBuffer的现有内容。
在基于tile的gpu上这意味着RenderBuffer内容不需要加载到tile内存中从而提供了性能提升。
Rendering.RenderBufferStoreAction
这个枚举描述了当GPU完成渲染到渲染目标时应该在渲染目标上做什么。
当GPU完成渲染到渲染目标时此设置指定应该对渲染结果执行的操作。
如果存储操作为“不关心”基于tile的gpu可能会获得性能优势。
例如如果渲染帧后不需要深度缓冲区内容则此设置可能很有用。
请注意并非所有平台都有加载/存储操作因此此设置可能在运行时被忽略。
通常面向移动设备的图形api
如果你使用RenderBufferLoadAction.DontCare渲染可能会失败或产生伪影因为深度纹理中未定义的像素会导致深度测试失败。
你可以使用LoadStoreActionDebugModeSettings来突出显示未定义的像素。
StoreRenderBuffer内容需要存储到RAM中。
如果表面启用了MSAA则存储多采样版本未解析的表面。
Resolve解析MSAA曲面后再保存。
StoreAndResolve解析MSAA表面但也存储多采样版本。
DontCareRenderBuffer的内容是不需要的可以被丢弃。
基于tile的gpu将完全跳过写入表面内容从而提供性能提升。
Rendering.RenderTargetIdentifier
pass);添加一个命令使用着色器将纹理中的像素数据复制到渲染纹理中。
这个方法增加了一个命令将像素数据从GPU上的纹理复制到GPU上的渲染纹理。
这是复制纹理最快的方法之一。
设置为dest纹理。
将source作为_MainTex属性传递给mat材质。
使用材质的着色器绘制从源纹理到目标纹理的全屏表面。
如果你提供一个没有_MainTex属性的mat材质Blit不会使用source。
Blit改变了RenderTexture.active。
在使用Blit之前存储active
避免将source和dest设置为相同的渲染纹理因为这可能导致未定义的行为。
使用带有双缓冲的自定义渲染纹理代替或者使用两个渲染纹理并在它们之间交替手动实现双缓冲。
在线性色彩空间中在使用Blit之前设置GL.sRGBWrite以确保srgb到线性色彩转换是您所期望的。
将dest设置为空。
Unity现在使用Camera.main.targetTexture作为目标纹理。
设置
Camera.main的Camera.targetTexture
要在通用渲染管道(URP)或高清晰度渲染管道(HDRP)中将数据blit到屏幕上必须在你从RenderPipelineManager.endContextRendering调用的方法中回调处调用Graphics.Blit或
如果你想使用源(渲染)纹理一部分的深度或模板缓冲区或者blit到纹理的子区域你必须手动编写一个等效的Graphics.Blit函数——即使用目标颜色缓冲区和源深度缓冲区设置Graphics.SetRenderTarget
projection(GL.LoadOrtho)设置材质通道(material
dest的先前内容。
在这种情况下建议使用SetRenderTarget使用适当的加载和存储操作显式地激活dest渲染目标。
Blit
dest应该被设置为BuiltinRenderTextureType.CurrentActive。
同理还有FLoatArray、Int、Matrix、MatrixArray、Texture、Vector、VectorArrayvoid
SetViewProjectionMatrices(Matrix4x4
proj);渲染纹理绑定绑定渲染纹理后才能再Pass中使用该Texture。
当命令缓冲区将被执行时一个全局着色器纹理属性将在此时被设置。
Rendering.RenderTargetIdentifier
Rendering.RenderTargetIdentifier
Rendering.RenderTargetIdentifier
Rendering.RenderTextureSubElement
Rendering.RenderTargetIdentifier
Rendering.RenderTextureSubElement
所有的绘制命令都不会自动添加关于光照、阴影、全局光照等相关数据如果需要相关变量数据需要手动设置参数数据。
否则如果在Shader中使用相关变量结果是未定义的。
//使用的转化矩阵Matrix4x4.identityMaterial
//程序几何的拓扑结构。
MeshTopology.Trianglesint
//要渲染的实例数。
MaterialPropertyBlock
DrawMeshInstancedProcedural(Mesh
DrawProceduralIndirect(Matrix4x4
normalizedCamViewport);程序化绘制Procedural没有任何顶点或索引缓冲区
当命令缓冲区执行时这将在GPU上执行绘制调用没有任何顶点或索引缓冲区。
这主要用于Shader
4.5级硬件Shader可以从ComputeBuffer缓冲区读取任意数据。
在顶点着色器中你通常会使用SV_VertexID和SV_InstanceID输入变量从而从一些缓冲区中获取数据。
注意这个drawCall不会设置任何与照明相关的着色器数据(光的颜色方向阴影光和反射探针等)。
如果材质使用的着色器使用任何与照明相关的变量结果是未定义的。
srcElement:纹理下标例如CubeMapTexture2DArray等
ConvertTexture(RenderTargetIdentifier
ConvertTexture(RenderTargetIdentifier
CopyCounterValue(ComputeBuffer/GraphicsBuffer
CopyTexture(Rendering.RenderTargetIdentifier
Rendering.RenderTargetIdentifier
清除缓冲区中的所有命令。
ClearRandomWriteTargets();清除level
shaders的随机写入目标。
ClearRenderTarget(bool
ClearRenderTarget(Rendering.RTClearFlags
IncrementUpdateCount(Rendering.RenderTargetIdentifier
该标志可“翻转”所有已渲染对象的剔除模式。
主要用例渲染镜子、水等的反射。
由于为用于渲染此反射的虚拟摄像机生成了镜像因此必须反转剔除顺序。
您可以看到
RequestAsyncReadbackIntoNativeArrayT
RequestAsyncReadbackIntoNativeSliceT
WaitAllAsyncReadbackRequests();
Dispatch或纹理复制命令后通过GraphicsFence
CreateAsyncGraphicsFence(Rendering.SynchronisationStage
WaitOnAsyncGraphicsFence(Rendering.GraphicsFence
WaitOnAsyncGraphicsFence(Rendering.GraphicsFence
SetExecutionFlags(Rendering.CommandBufferExecutionFlags
IssuePluginCustomTextureUpdateV2
IssuePluginEventAndDataWithFlags
SetComputeFloatParam、SetComputeIntParam、SetComputeVectorParam
、SetComputeVectorArrayParam、SetComputeMatrixParam…
添加了一个命令来选择在执行光线/几何相交时使用哪个着色器通道着色。
SetRayTracingShaderPass添加一个命令来执行RayTracingShader。
DispatchRays(Experimental.Rendering.RayTracingShader
camera);SetRayTracingAccelerationStructure
SetRayTracingConstantBufferParam
SetFoveatedRenderingMode(Rendering.FoveatedRenderingMode
CommandBuffer.SetSinglePassStereo(SinglePassStereoMode)
UnmarkLateLatchMatrix(Rendering.CameraLateLatchMatrixType
方法实现通常会针对每个摄像机剔除渲染管线不需要渲染的对象请参阅
ScriptableRenderContext.DrawRenderers
ScriptableRenderContext.ExecuteCommandBuffer
调用。
这些调用会设置全局着色器属性、更改渲染目标、分发计算着色器和其他渲染任务。
ScriptableRenderContext.Submit。
Rendering.ScriptableCullingParameters
ScriptableRenderContext剔除结果所用的内存会在渲染循环完成后得到释放。
gizmoSubset);...//BeforeRendering
//从ScriptableRenderContext.Cull中获得ref
ReflectionProbes/LightProbeProxyVolume/
Lightmaps/LightData/MotionVectors/LightIndices/ReflectionProbeData/OcclusionProbe/OcclusionProbeProxyVolume/shadowMask*///
stateBlock);//RenderStateBlock结构
m_RenderStateBlock.stencilReference
m_RenderStateBlock.stencilState
Execute(ScriptableRenderContext
renderingData){....context.ExecuteCommandBuffer(cmd);cmd.Clear();//
objects...context.DrawRenderers(renderingData.cullResults,
Rendering.ShadowDrawingSettings
//Rendering.ShadowDrawingSettings
ShadowDrawingSettings(cullResults,
m_CascadeSlices[cascadeIndex].splitData;Vector4
m_CascadeSlices[cascadeIndex].projectionMatrix,
m_CascadeSlices[cascadeIndex].resolution);ShadowUtils.SetupShadowCasterConstantBuffer(cmd,
shadowBias);CoreUtils.SetKeyword(cmd,
ShaderKeywordStrings.CastingPunctualLightShadow,
false);ShadowUtils.RenderShadowSlice(cmd,
m_CascadeSlices[cascadeIndex],ref
settings,m_CascadeSlices[cascadeIndex].projectionMatrix,
m_CascadeSlices[cascadeIndex].viewMatrix);
}//在RenderShadowSlice函数中使用了DrawShadows
RenderShadowSlice(CommandBuffer
https://github.com/Unity-Technologies/Graphics/blob/9544b8ed2f98c62803d285096c91b44e9d8cbc47/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowAtlas.cs#L197
shadowSliceData.resolution));cmd.SetViewProjectionMatrices(view,
proj);context.ExecuteCommandBuffer(cmd);cmd.Clear();context.DrawShadows(ref
settings);cmd.DisableScissorRect();context.ExecuteCommandBuffer(cmd);cmd.Clear();cmd.SetGlobalDepthBias(0.0f,
DrawSkybox函数在DrawSkyboxPass使用作为单独的一个Pass。
context.DrawWireOverlay(camera);
注意DrawWireOverlay只在Unity编辑器中起作用
并且SceneView.CamerMode.drawMode设置为
如果不满足这些条件调用DrawWireOverlay就没有效果。
context.ExecuteCommandBuffer(cmd);
ExecuteCommandBufferAsync(Rendering.CommandBuffer
queueType);是对异步计算队列调度命令缓冲区的执行。
另请参阅SystemInfo.supportsAsyncCompute、GPUFence。
context.SetupCameraProperties(camera);
在调用ScriptableRenderContext.ExecuteCommandBuffer期间,
ScriptableRenderContext将commandBuffer参数注册到其要执行的命令的内部列表中。
这些命令(包括存储在自定义commandBuffer中的命令)的实际执行发生在ScriptableRenderContext.Submit期间。
如果您的绘制调用依赖于您在CommandBuffer中指定的管道状态请确保在其他ScriptableRenderContext方法(如DrawRenderers,
DrawShadows)之前调用ExecuteCommandBuffer。
即如果DrawRenderers需要CommandBuffer中的命令作为前置条件则必须先提交缓存命令再使用DrawRenderers函数。
否则即使在DrawRenderers函数之前将命令添加到了commandBuffer,但会因为提交顺序导致最终结果的不正确。
(!context.SubmitForRenderPassValidation()){…}
由BeginRenderPass调用启动的渲染传递是否可以执行预定的命令。
context.InvokeOnRenderObjectCallback();
在InvokeOnRenderObjectCallbackPass.cs中调用context.InvokeOnRenderObjectCallback();
ScriptableRenderContext.EmitWorldGeometryForSceneView(camera);
(isSceneViewCamera){ScriptableRenderContext.EmitWorldGeometryForSceneView(camera);}
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback