Version: 6000.3
语言: 中文
将纹理导入 URP 中的渲染图系统
在 URP 中的渲染通道之间传输纹理

在 URP 的渲染通道中使用纹理

可以使用渲染图系统 API 将纹理设置为自定义渲染通道的输入或输出,以便可以读取或写入纹理。

不能在渲染通道中同时读取和写入同一纹理。有关更多信息,请参阅在渲染通道期间更改渲染目标

将纹理设置为输入

要将纹理设置为自定义渲染通道的输入,请执行以下步骤:

  1. RecordRenderGraph方法中,将纹理句柄字段添加到通道使用的数据中。

    例如:

    // Create the data your pass uses
    public class MyPassData
    {
        // Add a texture handle
        public TextureHandle textureToUse;
    }
    
  2. 将纹理手柄设置为要使用的纹理。

    例如:

    // Add the texture handle to the data
    RenderTextureDescriptor textureProperties = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);
    TextureHandle textureHandle = UniversalRenderer.CreateRenderGraphTexture(renderGraph, textureProperties, "My texture", false);
    passData.textureToUse = textureHandle;
    
  3. 调用UseTexture将纹理设置为输入的方法。

    例如:

    builder.UseTexture(passData.textureToUse, AccessFlags.Read);
    

在您的SetRenderFunc方法,您现在可以使用TextureHandle对象作为 API 的输入,例如Blitter.BlitTexture.

将纹理设置为渲染目标

要将纹理设置为命令的输出,例如BlitRecordRenderGraph方法,使用SetRenderAttachment方法。这SetRenderAttachment方法默认将纹理设置为只写。

例如,以下命令创建临时纹理,并将其设置为渲染通道的渲染目标:

// Create texture properties
RenderTextureDescriptor textureProperties = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);

// Create the texture
TextureHandle targetTexture = UniversalRenderer.CreateRenderGraphTexture(renderGraph, textureProperties, "My texture", false);

// Set the texture as the render target
// The second parameter is the index the shader uses to access the texture
builder.SetRenderAttachment(targetTexture, 0);

在您的SetRenderFunc方法,您现在可以使用 API 写入纹理,例如Blitter.BlitTexture.

你不需要将纹理添加到通道数据中。渲染图表系统在执行渲染通道之前会自动为您设置纹理。

如果需要将对象绘制到渲染目标,请参阅在渲染通道中绘制对象以获取更多信息。

在渲染通道期间更改渲染目标

你无法更改URP在渲染图系统渲染通道期间写入的纹理。

您可以改为执行以下任一作:

  • 创建第二个自定义渲染通道,并使用builder.SetRenderAttachment在第二个渲染过程中更改渲染目标。
  • 使用UnsafePassAPI,以便您可以使用SetRenderTargetAPI 中的SetRenderFunc方法。有关更多信息和示例,请参阅在渲染图渲染通道中使用兼容模式 API

您可以使用这些方法读取和写入同一纹理,方法是先从纹理复制到您创建的临时纹理,然后复制回来。

如果你blit“位块传输”的简写术语。blit作是将数据块从内存中的一个位置传输到另一个位置的过程。
请参阅术语表
在具有不同属性的多个纹理之间,渲染速度可能会很慢,因为 URP 无法将 BLIT 合并到单个原生渲染通道中。使用AddUnSafePassAPI 和SetRenderTarget()方法。

例子

请参阅以下内容:

将纹理导入 URP 中的渲染图系统
在 URP 中的渲染通道之间传输纹理