包含此页的版本:
不含此页的版本:
您可以使用渲染图AddUnsafePassAPI 来使用 CommandBuffer 接口 API,例如SetRenderTarget在渲染图系统中渲染通道。
这AddUnsafePassAPI 提供对 UnsafeCommandBuffer 的访问权限,从而可以访问更多CommandBuffer函数而不是 RasterCommandBuffer API。
注意:两者AddUnsafePass和RasterCommandBuffer限制对某些人的访问commandBuffer函数,以便RenderGraph可以更好地优化框架。最重要的功能unsafeCommandbuffer允许您访问 ISSetRenderTarget.
如果您使用AddUnsafePassAPI,以下内容适用:
SetRenderAttachment方法RecordRenderGraph方法。用SetRenderTarget在SetRenderFunc方法。要创建不安全的渲染通道,请按照下列步骤作:
在您的RecordRenderGraph方法,使用AddUnsafePass方法而不是AddRasterRenderPass方法。
例如:
using (var builder = renderGraph.AddUnsafePass<PassData>("My unsafe render pass", out var passData))
当您调用SetRenderFunc方法,使用UnsafeGraphContexttype 而不是RasterGraphContext.
例如:
builder.SetRenderFunc(
(PassData passData, UnsafeGraphContext context) => ExecutePass(passData, context)
);
如果渲染通道写入纹理,请将纹理添加为通道数据类中的字段。
例如:
private class PassData
{
internal TextureHandle textureToWriteTo;
}
如果渲染通道写入纹理,请使用UseTexture方法。
例如:
builder.UseTexture(passData.textureToWriteTo, AccessFlags.Write);
您现在可以在SetRenderFunc方法。
以下示例使用 CommandBuffer 接口SetRenderTargetAPI 在渲染过程中将渲染目标设置为活动颜色缓冲区,然后使用对象的表面法线作为颜色绘制对象。
using UnityEngine;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class DrawNormalsToActiveColorTexture : ScriptableRendererFeature
{
DrawNormalsPass unsafePass;
public override void Create()
{
unsafePass = new DrawNormalsPass();
unsafePass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(unsafePass);
}
class DrawNormalsPass : ScriptableRenderPass
{
private class PassData
{
internal TextureHandle activeColorBuffer;
internal TextureHandle cameraNormalsTexture;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
{
using (var builder = renderGraph.AddUnsafePass<PassData>("Draw normals", out var passData))
{
// Make sure URP generates the normals texture
ConfigureInput(ScriptableRenderPassInput.Normal);
// Get the frame data
UniversalResourceData resourceData = frameContext.Get<UniversalResourceData>();
// Add the active color buffer to our pass data, and set it as writeable
passData.activeColorBuffer = resourceData.activeColorTexture;
builder.UseTexture(passData.activeColorBuffer, AccessFlags.Write);
// Add the camera normals texture to our pass data
passData.cameraNormalsTexture = resourceData.cameraNormalsTexture;
builder.UseTexture(passData.cameraNormalsTexture);
builder.AllowPassCulling(false);
builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => ExecutePass(data, context));
}
}
static void ExecutePass(PassData passData, UnsafeGraphContext context)
{
// Create a command buffer for a list of rendering methods
CommandBuffer unsafeCommandBuffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd);
// Add a command to set the render target to the active color buffer so URP draws to it
context.cmd.SetRenderTarget(passData.activeColorBuffer);
// Add a command to copy the camera normals texture to the render target
Blitter.BlitTexture(unsafeCommandBuffer, passData.cameraNormalsTexture, new Vector4(1, 1, 0, 0), 0, false);
}
}
}
对于另一个示例,请参阅通用渲染管线(URP)包示例中名为 UnsafePass 的示例。