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

Трехмерная текстура – это растровое изображение, содержащее информацию в трех измерениях, а не в стандартных двух. 3D-текстуры обычно используются для имитации объемных эффектов, таких как туман или дым, для аппроксимации объемной трехмерной сеткиосновного графического примитива Unity. . Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
См. в Словарь
, или сохранить анимированные текстуры и плавно смешивать их между собой.

Размер 3D-текстуры

Максимальное разрешение 3D-текстуры – 2048 x 2048 x 2048.

Учтите, что размер 3D-текстуры в памяти и на диске быстро увеличивается по мере увеличения ее разрешения. Трехмерная текстура RGBA32 без мипмапов и разрешением 16 x 16 x 16 имеет размер 128 КБ, а с разрешением 256 x 256 x 256 — 512 МБ.

Импорт 3D-текстур

Вы можете импортировать 3D-текстуры из исходных файлов текстур, разделенных на ячейки. Они называются текстурами флипбука. Для этого:

  1. Импортируйте исходную текстуру в свой проект Unity.
  2. В представлении «Проект» выберите полученный объект текстуры. Unity отображает настройки импорта текстуры в Инспектореокне Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. Дополнительная информация
    См. в Словарь
    .
  3. В Инспекторе установите для параметра Форма текстуры значение 3D. Unity отображает свойства Columns и Rows.
  4. Установите для Столбцов и Строек соответствующие значения для вашей текстуры флипбука.
  5. Нажмите Применить.

Дополнительную информацию см. в настройках импорта текстур.

Изображение флипбука в виде 3D-формы
Изображение флипбука в виде 3D-формы

Создание 3D-текстуры из скрипта

Unity использует класс Texture3D для представления трехмерных текстур. Используйте этот класс для взаимодействия с 3D-текстурами в C# скриптыфрагмент кода, который позволяет создавать собственные компоненты, запускать игровые события , изменяйте свойства компонента с течением времени и реагируйте на ввод данных пользователем любым удобным для вас способом. Подробнее
См. в Словарь
.

Следующий пример представляет собой сценарий редактора, который создает экземпляр класса Texture3D, заполняет его данными о цвете, а затем сохраняет его в вашем проекте в виде сериализованного файла ресурса.

using UnityEditor; using UnityEngine; public class ExampleEditorScript : MonoBehaviour { [MenuItem("CreateExamples/3DTexture")] static void CreateTexture3D() { // Configure the texture int size = 32; TextureFormat format = TextureFormat.RGBA32; TextureWrapMode wrapMode = TextureWrapMode.Clamp; // Create the texture and apply the configuration Texture3D texture = new Texture3D(size, size, size, format, false); texture.wrapMode = wrapMode; // Create a 3-dimensional array to store color data Color[] colors = new Color[size * size * size]; // Populate the array so that the x, y, and z values of the texture will map to red, blue, and green colors float inverseResolution = 1.0f / (size - 1.0f); for (int z = 0; z < size; z++) { int zOffset = z * size * size; for (int y = 0; y < size; y++) { int yOffset = y * size; for (int x = 0; x < size; x++) { colors[x + yOffset + zOffset] = new Color(x * inverseResolution, y * inverseResolution, z * inverseResolution, 1.0f); } } } // Copy the color values to the texture texture.SetPixels(colors); // Apply the changes to the texture and upload the updated texture to the GPU texture.Apply(); // Save the texture to your Unity Project AssetDatabase.CreateAsset(texture, "Assets/Example3DTexture.asset"); } }

Предварительный просмотр 3D-текстуры

Редактор Unity имеет три разных режима визуализации, которые можно использовать для предварительного просмотра 3D-текстуры:

  • Объемный режим визуализации визуализирует 3D-текстуру в виде полупрозрачного куба
  • Режим визуализации Срез визуализирует один срез по каждой из трех осей 3D-текстуры.
  • В режиме визуализации SDF текстура визуализируется как поле расстояния со знаком в трехмерном пространстве.

Вы можете предварительно просмотреть 3D-текстуру в Инспекторе или написать сценарий для ее предварительного просмотра в СценеСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Просмотреть в представлении Словарь
с помощью Handles API. Использование Инспектора быстро и удобно, но не позволяет использовать пользовательские градиенты. API Handles позволяет настроить предварительный просмотр в соответствии с вашими требованиями и позволяет использовать пользовательские градиенты.

Использование инспектора

Чтобы просмотреть 3D-текстуру в окне инспектора:

  1. В вашем окне проектаокне, в котором отображается содержимое ваших активов папка (вкладка «Проект») Подробнее
    См. в Словарь
    , выберите объект текстуры. Средство импорта ассетов текстур для этого ассета текстуры теперь отображается в Инспекторе, а Unity отрисовывает предварительный просмотр 3D-текстуры в нижней части Инспектора.
  2. Перейдите к панели инструментовряду кнопок и основных элементов управления в верхней части редактора Unity, который позволяет вам взаимодействовать с редактор различными способами (например, масштабирование, перевод). Подробнее
    См. Словарь
    над предварительным просмотром 3D-текстуры.
  3. Используйте кнопки в правой части панели инструментов для выбора режимов визуализации Volumetric, Slice и SDF. Изображение предварительного просмотра и кнопки на панели инструментов меняются в зависимости от режима предварительного просмотра.

Объемный

В этом режиме визуализации Unity визуализирует 3D-текстуру в виде полупрозрачного куба.

На панели инструментов доступны следующие элементы управления:

Контроль: Функции:
Ramp Включает и отключает визуализацию цветовой шкалы. Если изображение содержит много тонких деталей, включите Ramp, чтобы эти детали было легче увидеть.
Quality Устанавливает образец текстуры для пикселянаименьшей единицы в компьютерном изображении. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
См. в Словарь
. Более высокие значения приводят к более высокому качеству рендеринга.
Alpha Управляет непрозрачностью визуализации. Значение 1 полностью непрозрачно, а значение 0 полностью прозрачно. Отрегулируйте для просмотра внутренних пикселей.

Slice

В этом режиме визуализации Unity визуализирует срезы каждой осевой плоскости 3D-текстуры.

На панели инструментов доступны следующие элементы управления:

Контроль: Функции:
Ramp Включает и отключает визуализацию цветовой шкалы. Если изображение содержит много тонких деталей, включите Ramp, чтобы эти детали было легче увидеть.
X Устанавливает положение среза по оси x в пикселях текстуры. Отрегулируйте для просмотра определенного фрагмента.
Y Устанавливает положение среза по оси Y в пикселях текстуры. Отрегулируйте для просмотра определенного фрагмента.
Z Устанавливает положение среза по оси Z в пикселях текстуры. Отрегулируйте для просмотра определенного фрагмента.

SDF

В этом режиме визуализации Unity использует рендерингполя расстояний со знаком. Процесс отрисовки графики на экран (или в визуализацию). текстура). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
Смотрите в режиме Словарь
в 3D-пространстве для рендеринга 3D-текстуры. Обратите внимание, что этот режим визуализации поддерживает только ненаправленные поля расстояния со знаком.

На панели инструментов доступны следующие элементы управления:

Контроль: Функции:
Scale Число, на которое умножается размер шага луча. Размер шага луча — это расстояние между двумя соседними пикселями.

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

Offset Интенсивность пикселей, с которой визуализируется поверхность. Когда это значение положительное, Unity расширит отображаемую поверхность. Когда это значение отрицательное, Unity будет отображать пустое пространство как поверхность, а поверхность — как пустое пространство.

Использование API дескрипторов

Информацию о предварительном просмотре 3D-текстуры с помощью Handles API и примеры кода см. в следующей документации:

Использование 3D-текстуры в шейдере

Вот пример простого raymarching шейдерапрограммы, работающей на графическом процессоре. Подробнее
См. Словарь
, в котором для визуализации объема используется 3D-текстура.

Shader "Unlit/VolumeShader" { Properties { _MainTex ("Texture", 3D) = "white" {} _Alpha ("Alpha", float) = 0.02 _StepSize ("Step Size", float) = 0.01 } SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" } Blend One OneMinusSrcAlpha LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" // Maximum amount of raymarching samples #define MAX_STEP_COUNT 128 // Allowed floating point inaccuracy #define EPSILON 0.00001f struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; float3 objectVertex : TEXCOORD0; float3 vectorToSurface : TEXCOORD1; }; sampler3D _MainTex; float4 _MainTex_ST; float _Alpha; float _StepSize; v2f vert (appdata v) { v2f o; // Vertex in object space this will be the starting point of raymarching o.objectVertex = v.vertex; // Calculate vector from camera to vertex in world space float3 worldVertex = mul(unity_ObjectToWorld, v.vertex).xyz; o.vectorToSurface = worldVertex - _WorldSpaceCameraPos; o.vertex = UnityObjectToClipPos(v.vertex); return o; } float4 BlendUnder(float4 color, float4 newColor) { color.rgb += (1.0 - color.a) * newColor.a * newColor.rgb; color.a += (1.0 - color.a) * newColor.a; return color; } fixed4 frag(v2f i) : SV_Target { // Start raymarching at the front surface of the object float3 rayOrigin = i.objectVertex; // Use vector from camera to object surface to get ray direction float3 rayDirection = mul(unity_WorldToObject, float4(normalize(i.vectorToSurface), 1)); float4 color = float4(0, 0, 0, 0); float3 samplePosition = rayOrigin; // Raymarch through object space for (int i = 0; i < MAX_STEP_COUNT; i++) { // Accumulate color only within unit cube bounds if(max(abs(samplePosition.x), max(abs(samplePosition.y), abs(samplePosition.z))) < 0.5f + EPSILON) { float4 sampledColor = tex3D(_MainTex, samplePosition + float3(0.5f, 0.5f, 0.5f)); sampledColor.a *= _Alpha; color = BlendUnder(color, sampledColor); samplePosition += rayDirection * _StepSize; } } return color; } ENDCG } } }

Если вы используете этот шейдер с 3D-текстурой, созданной в примере вверху страницы, результат будет выглядеть следующим образом:

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