版本:Unity 6 (6000.0)
语言:英语
将纹理导入 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)的输入。

将纹理设置为渲染目标

要将纹理设置为命令(如Blit)的输出,在RecordRenderGraph方法中,使用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来更改渲染目标。
  • 使用UnsafePass API,以便您可以在SetRenderFunc方法中使用SetRenderTarget API。有关更多信息和示例,请参阅在渲染图渲染通道中使用兼容模式 API

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

如果您在几个具有不同属性的纹理之间进行blit“位块传输”的简称。blit 操作是将数据块从内存中的一个位置传输到另一个位置的过程。
请参阅词汇表
,渲染可能会很慢,因为 URP 无法将 blit 合并到单个本地渲染通道中。改为使用AddUnSafePass API 和SetRenderTarget()方法。

示例

请参阅以下内容:

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