您可以使用渲染图系统 API 将纹理设置为自定义渲染通道的输入或输出,以便可以读取或写入它。
您不能在渲染通道中同时读取和写入同一纹理。有关详细信息,请参阅在渲染通道期间更改渲染目标。
要将纹理设置为自定义渲染通道的输入,请按照以下步骤操作:
在RecordRenderGraph
方法中,在通道使用的您的数据中添加一个纹理句柄字段。
例如:
// Create the data your pass uses
public class MyPassData
{
// Add a texture handle
public TextureHandle textureToUse;
}
将纹理句柄设置为要使用的纹理。
例如:
// 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;
调用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()
方法。
请参阅以下内容: