Unity 6.3
0 онлайн 95 гостей 3 в системе
Вход
Конвейеры отображения Шаг 90 из 129

Создание текстуры как глобальной текстуры в 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); вместо одного. Однако это потребляет больше памяти.