Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты
к API скриптам

Пользовательские Render Textures

Пользовательские текстуры рендеринга — это особый тип текстуры, который позволяет обновлять текстуру с помощью шейдераПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь
. Они являются расширением рендеринговых текстуртекстур специального типа, которые создаются и обновляются во время выполнения. Чтобы использовать их, сначала создайте новую текстуру рендеринга и назначьте одну из ваших камер для рендеринга в нее. Затем вы можете использовать Render Texture в материале, как обычную текстуру. Подробнее
См. в Словарь
. Пользовательские текстуры рендеринга можно использовать для создания сложных симуляций, таких как каустика, имитация ряби для эффектов дождя и брызг жидкости.

Функция Custom Render Textures предоставляет скрипты и структуру шейдеров, помогающие выполнять сложную настройку, например различную частоту обновлений, частичные или многопроходные обновления.

Чтобы использовать этот фреймворк, вам необходимо назначить материал для объекта Custom Render Texture. Пользовательские текстуры рендеринга требуют совместимого материала. Дополнительную информацию см. в разделе Написание шейдера для пользовательской текстуры рендеринга.

Чтобы назначить совместимый материал ресурсу Custom Render Texture:

  1. Создайте новый объект Custom Render Texture.
  2. Назначьте ему совместимый Материал в свойстве Материал в ресурсе Пользовательская текстура рендеринга.

Этот материал обновляет содержимое текстуры в соответствии с ее параметрами.

Эта страница содержит следующую информацию:

Совместимость конвейера рендеринга

В следующей таблице описана совместимость между функцией Пользовательские текстуры рендеринга и каждым конвейером рендеринга:

Функция Встроенный конвейер рендеринга Универсальный конвейер рендеринга (URP) Конвейер рендеринга высокого разрешения (HDRP) Пользовательский конвейер рендеринга с поддержкой сценариев (SRP)
Пользовательские Render Textures Да (1) Да (1) Да (1) Да (1)

Примечание.

  1. В настоящее время вы не можете создавать материалы, которые обновляют и инициализируют пользовательские текстуры визуализации в График шейдеров. Вы можете создавать шейдеры, которые работают только с пользовательскими текстурами рендеринга, написав ShaderLabязык Unity для определения структуры шейдерных объектов. Подробнее
    См. в коде Словарь
    .

Характеристики

Окно Пользовательские текстуры рендеринга ИнспекторОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, настройки актива или проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
See in Словарь
отображает многие из тех же свойств, что и инспектор текстуры рендеринга, и некоторые свойства, характерные для Пользовательских текстур визуализации.

Render Texture:

Свойства: Функции:
Dimension Размер рендер-текстуры.
2D Делает Render Texture двумерной.
Cube Делает Render Texture кубической картой.
3D Делает Render Texture трехмерной.
Size Размер Render Texture в пикселяхНаименьшая единица компьютерного изображения. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. More info
See in Словарь
.
Color Format Формат Render Texture.
sRGB (Color Render Texture) Включите, чтобы разрешить Render Texture использовать преобразования чтения/записи sRGB (только для чтения)..
Enable Mip Maps Включите это свойство, чтобы позволить Render Texture использовать MIP-карты.
Auto generate Mip Maps Включите это свойство, чтобы автоматически генерировать MIP-карты.
Wrap Mode Определяет, как Текстура ведет себя при тайлинге.
Repeat Текстура повторяется как плитка.
Clamp Unity растягивает края текстуры.
Filter Mode Определяет, как Unity фильтрует текстуру, когда она растягивается 3D-преобразованиями.
Point Текстура становится блочной вблизи.
Bilinear Текстура становится размытой вблизи.
Trilinear Как Bilinear, но Текстура также размывается между разными уровнями MIP.
Aniso LevelУровень анизотропной фильтрации (AF) текстуры. Позволяет повысить качество текстуры при просмотре текстуры под крутым углом. Подходит для текстур пола и земли. More info
See in Словарь
Повышает качество текстуры при просмотре текстуры под крутым углом. Подходит для текстур пола и земли.

Пользовательская текстура:

Эти свойства являются эксклюзивными для пользовательских текстур рендеринга. Пользовательские параметры текстуры разделены на три категории:

  • Материал: определяет, какой шейдер используется для обновления текстуры.
  • Инициализация. Управляет инициализацией текстуры перед тем, как шейдер выполнит какие-либо обновления.
  • Обновить: управляет тем, как шейдер обновляет текстуру.
Свойства: Функции:
MaterialРесурс, определяющий, как должна отображаться поверхность.. More info
See in Словарь
Материал, который Unity использует для обновления пользовательской текстуры рендеринга..
Shader Pass Shader Pass, который Unity использует для обновления Custom Render Texture. В раскрывающемся списке показаны все проходы, доступные в вашем материале..
Initialization Mode Скорость, с которой Unity инициализирует текстуру.
OnLoad Unity инициализирует текстуру один раз при создании.
Realtime Unity инициализирует текстуру каждый кадр.
OnDemand Unity инициализирует текстуру по запросу из скрипта.
Source Как текстура Unity инициализирует текстуру.
Texture and Color Unity использует текстуру, умноженную на цвет, для инициализации текстуры.
Initialization Color Определяет цвет, который Unity использует для инициализации пользовательской текстуры рендеринга. Если вы также предоставляете текстуру инициализации, Unity использует умножение цвета и текстуры для инициализации пользовательской текстуры рендеринга.
Initialization Texture Определяет текстуру, которую Unity использует для инициализации пользовательской текстуры рендеринга. Если вы также указываете Цвет инициализации, Unity использует умножение цвета и текстуры для инициализации пользовательской текстуры рендеринга.
Material Unity использует материал для инициализации текстуры.
Initialization Material Определяет материал, который Unity использует для инициализации пользовательской текстуры рендеринга.
Update Mode Скорость, с которой шейдер обновляет пользовательскую текстуру рендеринга..
OnLoad Шейдер обновляет текстуру один раз при создании.
Realtime Шейдер обновляет текстуру каждый кадр.
OnDemand Шейдер обновляет текстуру по требованию скрипта.
Period Время в секундах, в течение которого Unity обновляет текстуру в реальном времени. Значение 0.0 обновляет каждый кадр. Это свойство доступно только в том случае, если для свойства Режим обновления установлено значение «В реальном времени».
Double Buffered Двойная буферизация текстуры. Каждое обновление меняет местами два буфера. Это позволяет вам прочитать результат предыдущего обновления в шейдере.
Wrap Update Zones Включите, чтобы позволить зонам частичного обновления обтекать границу текстуры.
Cubemap Faces (Только для кубической карты) Серия переключателей, позволяющая пользователю включать/отключать обновление на каждой из граней кубической карты.
Update Zone Space Система координат, в которой Unity определяет зоны обновления.
Normalized Все координаты и размеры находятся в диапазоне от 0 до 1, а верхний левый угол начинается с (0, 0).
Pixel Все координаты и размеры выражаются в пикселях, ограниченных шириной и высотой текстуры. Верхний левый угол, начиная с (0, 0).
Update Zone List Список зон обновления текстуры. Дополнительную информацию см. в разделе Обновить зоны.

Экспорт пользовательской текстуры рендеринга в файл:

Вы можете экспортировать пользовательские текстуры рендеринга в файл PNG или EXR (в зависимости от формата текстуры) в меню Экспорт.

Обновление зон:

Когда Unity обновляет пользовательскую текстуру рендеринга, по умолчанию он использует материал для обновления всей текстуры одновременно. Custom Render Texture позволяет определить зоны частичного обновления. Вы можете использовать это, чтобы определить столько зон, сколько хотите, и порядок, в котором зоны обрабатываются.

Вы можете использовать зоны обновления для различных целей. Например, у вас может быть несколько небольших зон для разбрызгивания капель воды на текстуру, а затем полный проход для имитации ряби. Это также можно использовать в качестве оптимизации, когда вы знаете, что вам не нужно обновлять полную текстуру.

Зоны обновления имеют собственный набор свойств. На дисплее отображается Обновить пространство зоны. Координаты зависят от размера текстуры: 2D для 2D и кубических текстур или 3D для 3D-текстур.

Свойства: Функции:
Center Координаты центра зоны обновления.
Size Размер зоны обновления.
Rotation Ориентация зоны обновления в градусах (недоступно для 3D-текстур).
Shader Pass Определяет Shader Pass для использования в этой зоне обновления. Если вы установите это свойство по умолчанию, эта зона обновления использует Shader Pass, который вы определили в основной части инспектора. В противном случае он будет использовать предоставленный вами Shader Pass.
Swap (Double Buffer) (Только для текстур с двойной буферизацией) Когда вы включаете это свойство, Unity меняет местами буферы перед обработкой этой зоны обновления..

Управление пользовательской текстурой рендеринга из скрипта

Вы можете получить доступ к большинству функций Custom Render Texture в Scripting API. Вы также можете изменить параметры Материала, частоту обновления, зоны обновления, запросить обновление и многое другое с помощью скрипта.

Когда Unity обновляет или инициализирует пользовательскую текстуру рендеринга, она использует текущие свойства для рендеринга следующего кадра. Это гарантирует, что любой Материал, использующий эту текстуру, будет иметь актуальный результат. Например, в следующем скрипте Unity выполняет два обновления, используя второй массив Update Zone:

customRenderTexture.updateZones = updateZones1;

customRenderTexture.Update();

customRenderTexture.updateZones = updateZones2;

customRenderTexture.Update();

Примечание. Unity не обновляет и не инициализирует пользовательскую текстуру рендеринга одновременно с вызовом Update() или Инициализировать(). Это связано с тем, что Unity всегда обновляет и инициализирует пользовательскую текстуру рендеринга в начале следующего кадра.

Double Buffered Custom Textures

Вы можете дважды буферизовать пользовательские текстуры рендеринга. Для этого включите Двойную буферизацию в компоненте Пользовательские текстуры рендеринга или используйте CustomRenderTexture.doubleBuffered.

Двойная буферизация означает, что внутри одной пользовательской текстуры рендеринга есть две текстуры, которые Unity может менять местами после каждого обновления. Это позволяет вам читать результат последнего обновления при записи нового результата в Custom Render Texture.

Двойная буферизация особенно полезна, если шейдер должен использовать содержимое, которое Unity уже записал в текстуру, но не может смешивать значения с классическими режимами наложения. Это также необходимо, если шейдеры должны выбирать разные пиксели из предыдущего результата.

Предупреждение о производительности. В настоящее время двойная буферизация включает копию текстуры при каждой подкачке, что может привести к снижению производительности в зависимости от частоты, с которой это выполняется, и разрешения текстуры.

Связывание пользовательских текстур визуализации

Вы можете объединить пользовательские текстуры рендеринга в цепочку. Для этого используйте пользовательскую текстуру визуализации в качестве входных данных для материала, который вы назначили Материалу или Режим инициализации > Текстура в другой пользовательской текстуре визуализации.

Вы можете использовать связанные пользовательские текстуры рендеринга для создания симуляции с несколькими шагами.

Связанные в цепочку пользовательские текстуры рендеринга зависят друг от друга. Unity вычисляет эту зависимость автоматически, чтобы каждое обновление происходило в правильном порядке. Для этого он просматривает материалы, назначенные свойствам Материал и Режим инициализации > Текстура в окне инспектора Пользовательские текстуры рендеринга.

Написание шейдера для пользовательской текстуры рендеринга

Чтобы обновить пользовательскую текстуру рендеринга вручную, вы можете написать специальный шейдер пользовательской текстуры рендеринга.

Чтобы помочь вам в написании шейдеров Custom Render Texture, вот два примера фреймворка, которые содержат служебные функции и встроенные вспомогательные переменные.

В следующем примере шейдера текстура заполняется цветом, умноженным на цвет. Когда вы пишете шейдер для пользовательской текстуры рендеринга, вы должны сделать следующее:

  • #include "UnityCustomRenderTexture.cginc".
  • Используйте предоставленный Vertex ShaderПрограмму, которая запускается для каждой вершины 3D-модели во время рендеринга модели. Подробнее
    См. в Словарь
    CustomRenderTextureVertexShader .
  • Используйте предоставленную структуру ввода v2f_customrendertexture для пиксельного шейдера.
Shader "CustomRenderTexture/Simple" { Properties { _Color ("Color", Color) = (1,1,1,1) _Tex("InputTex", 2D) = "white" {} } SubShader { Lighting Off Blend One Zero Pass { CGPROGRAM #include "UnityCustomRenderTexture.cginc" #pragma vertex CustomRenderTextureVertexShader #pragma fragment frag #pragma target 3.0 float4 _Color; sampler2D _Tex; float4 frag(v2f_customrendertexture IN) : COLOR { return _Color * tex2D(_Tex, IN.localTexcoord.xy); } ENDCG } } }

Следующий пример представляет собой шейдер для материала, который можно использовать для инициализации пользовательской текстуры рендеринга. При написании шейдера для материала инициализации обязательными являются следующие шаги:

  • #include "UnityCustomRenderTexture.cginc"
  • Используйте предоставленный вершинный шейдер CustomRenderTextureVertexShader
  • Используйте предоставленную структуру ввода v2f_customrendertexture для пиксельного шейдера.
Shader "CustomRenderTexture/CustomTextureInit" { Properties { _Color ("Color", Color) = (1,1,1,1) _Tex("InputTex", 2D) = "white" {} } SubShader { Lighting Off Blend One Zero Pass { CGPROGRAM #include "UnityCustomRenderTexture.cginc" #pragma vertex InitCustomRenderTextureVertexShader #pragma fragment frag #pragma target 3.0 float4 _Color; sampler2D _Tex; float4 frag(v2f_init_customrendertexture IN) : COLOR { return _Color * tex2D(_Tex, IN.texcoord.xy); } ENDCG } } }

#include "UnityCustomRenderTexture.cginc" предоставляет доступ к набору встроенных значений. Сюда входят глобальные значения, значения из структуры v2f_customrendertexture и значения из структуры v2f_init_customrendertexture.

Структура v2f_customrendertexture принимает следующие входные данные:

Имя Тип Значение
localTexcoord float3 Координаты текстуры относительно обрабатываемой в данный момент зоны обновления.
globalTexcoord float3 Координаты текстуры относительно самой пользовательской текстуры рендеринга
primitiveID uint Индекс обрабатываемой в данный момент зоны обновления.
direction float3 Для Cube Custom Render Texture направление текущего пикселя внутри кубической картыколлекции из шести квадратных текстур, которые могут представлять отражения в окружение или скайбокс, нарисованный позади вашей геометрии. Шесть квадратов образуют грани воображаемого куба, окружающего объект; каждая грань представляет вид по направлениям мировых осей (вверх, вниз, влево, вправо, вперед и назад). More info
See in Словарь
.

The v2f_init_customrendertexture structure accepts the following inputs:

Имя Тип Значение
texcoord float3 Координаты текстуры относительно самой пользовательской текстуры рендеринга.

Следующие структуры являются глобальными значениями:

Имя Тип Значение
_CustomRenderTextureWidth float Ширина пользовательской текстуры в пикселях
_CustomRenderTextureHeight float Высота пользовательской текстуры в пикселях
_CustomRenderTextureDepth float Глубина пользовательской текстуры в пикселях (только для 3D-текстур, иначе всегда будет равна 1).
_CustomRenderTextureCubeFace float Индекс текущей грани кубической карты, которую обрабатывает Unity (-X, +X, -Y, +Y, -Z, +Z). Это относится только к кубическим картам.
_CustomRenderTexture3DSlice float Индекс текущего обрабатываемого 3D-среза. Это относится только к 3D-текстурам.
_SelfTexture2D Sampler2D Для текстур с двойной буферизацией: Текстура, содержащая результат последнего обновления перед последней заменой.
_SelfTextureCube SamplerCUBE Для текстур с двойной буферизацией: Текстура, содержащая результат последнего обновления перед последней заменой.
_SelfTexture3D Sampler3D Для текстур с двойной буферизацией: Текстура, содержащая результат последнего обновления перед последней заменой.

  • Новая функция в Unity 2017.1

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3