Трехмерная текстура – это растровое изображение, содержащее информацию в трех измерениях, а не в стандартных двух. 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-текстуры из исходных файлов текстур, разделенных на ячейки. Они называются текстурами флипбука. Для этого:
- Импортируйте исходную текстуру в свой проект Unity.
- В представлении «Проект» выберите полученный объект текстуры. Unity отображает настройки импорта текстуры в Инспектореокне Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. Дополнительная информация
См. в Словарь. - В Инспекторе установите для параметра Форма текстуры значение 3D. Unity отображает свойства Columns и Rows.
- Установите для Столбцов и Строек соответствующие значения для вашей текстуры флипбука.
- Нажмите Применить.
Дополнительную информацию см. в настройках импорта текстур.

Создание 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-текстуру в окне инспектора:
- В вашем окне проектаокне, в котором отображается содержимое ваших
активов
папка (вкладка «Проект») Подробнее
См. в Словарь, выберите объект текстуры. Средство импорта ассетов текстур для этого ассета текстуры теперь отображается в Инспекторе, а Unity отрисовывает предварительный просмотр 3D-текстуры в нижней части Инспектора. - Перейдите к панели инструментовряду кнопок и основных элементов управления в верхней части редактора Unity, который позволяет вам взаимодействовать с редактор различными способами (например, масштабирование, перевод). Подробнее
См. Словарь над предварительным просмотром 3D-текстуры. - Используйте кнопки в правой части панели инструментов для выбора режимов визуализации 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-текстурой, созданной в примере вверху страницы, результат будет выглядеть следующим образом:
