Создание текстуры как глобальной текстуры в URP
Если вам нужно использовать текстуру в качестве входа для шейдера на GameObject, вы можете установить текстуру как глобальную текстуру. Глобальная текстура доступна для всех шейдеров и проходов рендеринга.
Установка текстуры в качестве глобальной текстуры может замедлить отображение. См. SetGlobalTexture.
Не используйте небезопасный проход рендеринга и CommandBuffer.SetGlobal для установки текстуры в качестве глобальной текстуры, так как это может привести к ошибкам.
Чтобы установить глобальную текстуру, в методе RecordRenderGraph используйте методы SetGlobalTextureAfterPass.
Например:
// Allocate a global shader texture called _GlobalTexture
private int globalTextureID = Shader.PropertyToID("_GlobalTexture")
using (var builder = renderGraph.AddRasterRenderPass<PassData>("MyPass", out var passData)){
// Set a texture to the global texture
builder.SetGlobalTextureAfterPass(texture, globalTextureID);
}
Если вы еще не вызвали SetRenderFunc, вы также должны добавить пустую функцию рендера. Например:
builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => { });
Теперь вы можете:
- Доступ к текстуре в другом проходе рендеринга с
UseGlobalTexture()илиUseAllGlobalTextures()API. - Используйте текстуру на любом материале в вашей сцене, указав его
nameID.
Доступ к глобальной текстуре
Доступ к конкретной текстуре, установленной как глобальная текстура в другом проходе рендеринга с nameID текстуры (получить ее с Shader.PropertyToId). Обязательно установите соответствующие флаги доступа в зависимости от того, как проход использует глобальную текстуру.
Например:
class AccessGlobalTexturePass : ScriptableRenderPass
{
// The nameID of the globalTexture you want to use - which you have set in a previous pass
private int globalTextureID = Shader.PropertyToID("_GlobalTexture")
class PassData
{
// No local pass data needed
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
{
using (var builder = renderGraph.AddRasterRenderPass<PassData>("Fetch texture and draw triangle", out var passData))
{
// Set the inputs and outputs of your pass
// builder.SetRenderAttachment(/*...*/);
// builder.UseTexture(/*...*/);
// Use the global texture in this pass
builder.UseGlobalTexture(globalTextureID, AccessFlags.Read);
builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => ExecutePass(data, context));
}
}
static void ExecutePass(PassData data, RasterGraphContext context)
{
// ...
}
}
Примечание: Вы также можете использовать все глобальные текстуры в вашем пропуске с builder.UseAllGlobalTextures(true); вместо одного. Однако это потребляет больше памяти.