包含此页的版本:
不含此页的版本:
要在渲染图系统中创建纹理,请使用UniversalRenderer.CreateRenderGraphTexture应用程序接口。
当通用渲染管线获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管线中进行选择,或编写自己的渲染管线。更多信息
请参阅术语表(URP) 优化渲染图,如果最终帧不使用纹理,它可能不会创建纹理,以减少渲染通道使用的内存和带宽。有关 URP 如何优化渲染图的更多信息,请参阅渲染图系统简介。
有关在多个帧或多个帧上使用纹理的更多信息相机在场景中创建特定视点图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。更多信息
请参阅术语表,例如您在项目中导入的纹理资源,请参阅将纹理导入渲染图表系统。
要创建纹理,请在RecordRenderGraph你的方法ScriptableRenderPass类,请按照下列步骤作:
RenderTextureDescriptor对象,并具有所需的纹理属性。UniversalRenderer.CreateRenderGraphTexture方法创建纹理并返回纹理句柄。例如,以下内容创建与屏幕大小相同的纹理。
RenderTextureDescriptor textureProperties = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);
TextureHandle textureHandle = UniversalRenderer.CreateRenderGraphTexture(renderGraph, textureProperties, "My texture", false);
然后,您可以在同一个自定义渲染通道中使用纹理。
只有当前摄像机才能访问纹理。要在其他地方访问纹理,例如从另一个摄像机或自定义渲染代码中访问纹理,请改为导入纹理。
渲染图系统管理你创建的纹理的生命周期CreateRenderGraphTexture,因此当您完成它们时,您无需手动释放它们使用的内存。
你可以使用 渲染图表查看器(Render Graph Viewer) 窗口来检查URP如何处理纹理上的加载作。这对于调试结果并确认 Unity 是清除、保留还是丢弃纹理非常有用。
注意:该clear参数和AccessFlags值会影响 URP 设置纹理加载作的方式。这可能会影响渲染结果:
clear是true并且您使用AccessFlags.WriteAll,则加载动作为DontCare不Clear.这是因为 Unity 假定您覆盖了整个纹理,因此它会跳过清除纹理以优化性能。clear是false并且您使用AccessFlags.Write,则加载动作为Clear.这是因为 Unity 会自动清除纹理,以避免在仅写入部分纹理时渲染伪影。要跳过 Unity 清除纹理,请使用AccessFlags.WriteAll明确告诉 Unity 你正在编写完整的纹理。从另一个纹理的描述符创建纹理时,首选 RenderGraph.CreateTexture 而不是 CreateRenderGraphTexture。这可确保避免在不确切知道 RenderTextureDescriptor 描述的内容时可能出现的细微错误。 例如,避免使用以下模式:
var desc = cameraData.cameraTargetDescriptor; //this is a RenderTextureDescriptor
desc.graphicsFormat = GraphicsFormat.None;
var textureHandle = UniversalRenderer.CreateRenderGraphTexture(renderGraph, desc)
相反,请使用以下更可靠的模式:
var textureDesc = resourceData.cameraDepthTexture.GetDescriptor(renderGraph);
var textureHandle = RenderGraph.CreateTexture(textureDesc);
以下可脚本渲染器功能包含一个示例渲染通道,用于创建纹理并将其清除为黄色。有关将渲染通道添加到渲染管线的更多信息,请参阅使用可编写脚本的渲染器功能注入通道。
使用 帧调试器(Frame Debugger) 检查渲染通道添加的纹理。
using UnityEngine;
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering;
public class CreateYellowTextureFeature : ScriptableRendererFeature
{
CreateYellowTexture customPass;
public override void Create()
{
customPass = new CreateYellowTexture();
customPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(customPass);
}
class CreateYellowTexture : ScriptableRenderPass
{
class PassData
{
internal TextureHandle cameraColorTexture;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
{
using (var builder = renderGraph.AddRasterRenderPass<PassData>("Create yellow texture", out var passData))
{
// Create texture properties that match the screen size
RenderTextureDescriptor textureProperties = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);
// Create a temporary texture
TextureHandle texture = UniversalRenderer.CreateRenderGraphTexture(renderGraph, textureProperties, "My texture", false);
// Set the texture as the render target
builder.SetRenderAttachment(texture, 0, AccessFlags.Write);
builder.AllowPassCulling(false);
builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context));
}
}
static void ExecutePass(PassData data, RasterGraphContext context)
{
// Clear the render target to yellow
context.cmd.ClearRenderTarget(true, true, Color.yellow);
}
}
}
有关另一个示例,请参阅通用渲染管线(URP)包示例中名为 OutputTexture 的示例。