Использование трехмерных ресурсов в игре или приложении

В этой статье описано использование Visual Studio для обработки трехмерных ресурсов и включения их в состав сборок.

После создания трехмерных ресурсов с помощью средств в Visual Studio эти ресурсы можно использовать в приложении. Однако сначала их необходимо преобразовать в формат, поддерживаемый DirectX. Чтобы упростить преобразование ресурсов, Visual Studio предоставляет настройки сборки для каждого из создаваемых видов ресурсов. Для включения активов в состав сборки достаточно настроить проект на использование настроек сборки, добавить активы в проект и настроить их на использование подходящей настройки сборки. После этого вы можете загрузить активы в приложение и использовать их, создавая и заполняя ресурсы DirectX аналогично любому другому приложению DirectX.

Настройка проекта

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

Добавление настроек сборки в свой проект

  1. В обозревателе решений откройте контекстное меню для своего проекта и выберите Зависимости сборки>Настройки сборки.

    Отображается диалоговое окно Файлы настройки сборки для Visual C++.

  2. В области Доступные файлы настройки сборки установите флажки, соответствующие тем типам активов, которые вы хотите использовать в своем проекте, в соответствии со следующей таблицей:

    Вид актива Имя настройки сборки
    Текстуры и изображения ImageContentTask(.targets, .props)
    Трехмерные модели MeshContentTask(.targets, .props)
    Шейдеры ShaderGraphContentTask(.targets, .props)
  3. Нажмите кнопку ОК.

Включение ресурсов в состав сборки

Теперь, когда проект поддерживает разные виды трехмерных ресурсов, которые вы хотите использовать, необходимо сообщить ему, какие файлы являются трехмерными ресурсами и к каким типам ресурсов они относятся.

Добавление актива в сборку

  1. В обозревателе решений войдите в проект, откройте контекстное меню актива и выберите Свойства.

    Отображается диалоговое окно Страница свойств этого актива.

  2. Убедитесь, что для свойств Конфигурация и Платформа заданы значения, соответствующие необходимым вам изменениям.

  3. В области Свойства конфигурации выберите Общие, а затем в сетке свойств в области Общие установите для свойства Тип элемента соответствующий тип элемента конвейера содержимого. Например, для файла изображения или текстуры выберите Конвейер содержимого изображения.

    Важно!

    По умолчанию в Visual Studio предполагается, что множество видов файлов изображений следует классифицировать по типу элемента Изображение, встроенному в Visual Studio. Таким образом, вам нужно изменить значение свойства Тип элемента для каждого изображения, которое должно быть обработано конвейером содержимого изображения. Другие типы исходных файлов конвейера содержимого для трехмерных моделей и графиков визуальных шейдеров по умолчанию используют правильный Тип элемента.

  4. Нажмите кнопку ОК.

Ниже приведены три типа элемента конвейера содержимого и соответствующие им типы исходных и выходных файлов.

Тип элемента Типы исходных файлов Формат выходных файлов
Конвейер содержимого изображения Формат PNG (Portable Network Graphics)

Формат JPEG (JPG, JPEG, JPE, JFIF)

Поверхность DirectDraw (DDS)

Формат GIF (Graphics Interchange Format)

Точечный рисунок (BMP, DIB)

Формат TIFF (TIF, TIFF)

Формат Targa (TGA)
Поверхность DirectDraw (DDS)
Конвейер содержимого сетки Файл обмена данными AutoDesk FBX (FBX)

Файл Collada DAE (DAE)

Файл Wavefront OBJ (OBJ)
Файл трехмерной сетки (CMO)
Конвейер содержимого шейдера Визуальный граф шейдера (DGSL) Компилированный вывод шейдера (CSO)

Настройка свойств для конвейера содержимого ресурсов

Вы можете задать свойства конвейера содержимого для каждого из файлов активов, чтобы выполнить его сборку нужным образом.

Настройка свойств конвейера содержимого

  1. В обозревателе решений войдите в проект, откройте контекстное меню для файла актива и выберите Свойства.

    Отображается диалоговое окно Страница свойств этого актива.

  2. Убедитесь, что для свойств Конфигурация и Платформа заданы значения, соответствующие необходимым вам изменениям.

  3. В области Свойства конфигурации выберите узел конвейера содержимого, например Конвейер содержимого изображения для активов текстур и изображений, а затем задайте нужные значения для свойств в сетке свойств. Например, чтобы создать MIP-карты для актива текстуры во время сборки, задайте для свойства Создать MIP-объекты значение Да.

  4. Нажмите кнопку ОК.

Конфигурация конвейера содержимого изображения

При использовании средства конвейера содержимого изображения для сборки актива текстуры вы можете применять разнообразные способы сжатия текстуры, указывать, требуется ли создавать MIP-уровни во время сборки, а также изменять имя выходного файла.

Свойство Description
Сжатие Задает тип сжатия, используемый для выходного файла.

Доступные параметры:

- Без сжатия
- Сжатие BC1_UNORM
- Сжатие BC1_UNORM_SRGB
- Сжатие BC2_UNORM
- Сжатие BC2_UNORM_SRGB
- Сжатие BC3_UNORM
- Сжатие BC3_UNORM_SRGB
- Сжатие BC4_UNORM
- Сжатие BC4_SNORM
- Сжатие BC5_UNORM
- Сжатие BC5_SNORM
- Сжатие BC6H_UF16
- Сжатие BC6H_SF16
- Сжатие BC7_UNORM
- Сжатие BC7_UNORM_SRGB

Сведения о поддерживаемых форматах сжатия в разных версиях DirectX см. в руководстве по программированию для DXGI.
Преобразование в формат с предварительным умножением альфа-канала Да для преобразования изображения в формат с предварительным умножением альфа-канала в выходном файле; в противном случае Нет. Изменяется только выходной файл, исходное изображение остается неизменным.
Создать MIP-объекты Да для создания полной MIP-цепочки во время сборки и включения ее в выходной файл; в противном случае Нет. Если задано значение Нет и исходный файл уже содержит цепочку MIP-карт, то в выходном файле будет присутствовать MIP-цепочка; в противном случае выходной файл не будет содержать MIP-цепочку.
Вывод содержимого Указывает имя выходного файла. Важно! Изменение расширения имени выходного файла не оказывает никакого влияния на его формат.

Конфигурация конвейера содержимого сетки

При использовании средства конвейера содержимого сетки для сборки актива сетки вы можете изменить имя выходного файла.

Свойство Description
Вывод содержимого Указывает имя выходного файла. Важно! Изменение расширения имени выходного файла не оказывает никакого влияния на его формат.

Конфигурация конвейера содержимого шейдера

При использовании средства конвейера содержимого шейдера для сборки актива шейдера вы можете изменить имя выходного файла.

Свойство Description
Вывод содержимого Указывает имя выходного файла. Важно! Изменение расширения имени выходного файла не оказывает никакого влияния на его формат.

Загрузка и использование трехмерных ресурсов во время выполнения

Использование текстур и изображений

Direct3D предоставляет функции для создания ресурсов текстур. Служебная библиотека D3DX11 в Direct3D 11 предоставляет дополнительные функции для создания ресурсов текстур и представлений ресурсов прямо из файлов изображений. Дополнительные сведения о создании ресурса текстуры в Direct3D 11 см. в статье Текстуры. Дополнительные сведения об использовании библиотеки D3DX11 для создания ресурса текстуры или представления ресурсов из файла изображения см. в статье Практическое руководство. Инициализация текстуры из файла.

Использование трехмерных моделей

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

Использование шейдеров

Direct3D предоставляет функции для создания ресурсов шейдеров и их привязки к программируемому графическому конвейеру. Дополнительные сведения о создании ресурса шейдера в Direct3D и его привязке к конвейеру см. в руководстве по программированию для HLSL.

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

struct PixelShaderInput
{
    float4 pos : SV_POSITION;
    float4 diffuse : COLOR;
    float2 uv : TEXCOORD0;
    float3 worldNorm : TEXCOORD1;
    float3 worldPos : TEXCOORD2;
    float3 toEye : TEXCOORD3;
    float4 tangent : TEXCOORD4;
    float3 normal : TEXCOORD5;
};

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

Texture2D Texture1 : register( t0 );
Texture2D Texture2 : register( t1 );
Texture2D Texture3 : register( t2 );
Texture2D Texture4 : register( t3 );
Texture2D Texture5 : register( t4 );
Texture2D Texture6 : register( t5 );
Texture2D Texture7 : register( t6 );
Texture2D Texture8 : register( t7 );

TextureCube CubeTexture1 : register( t8 );
TextureCube CubeTexture2 : register( t9 );
TextureCube CubeTexture3 : register( t10 );
TextureCube CubeTexture4 : register( t11 );
TextureCube CubeTexture5 : register( t12 );
TextureCube CubeTexture6 : register( t13 );
TextureCube CubeTexture7 : register( t14 );
TextureCube CubeTexture8 : register( t15 );

SamplerState TexSampler : register( s0 );

cbuffer MaterialVars : register (b0)
{
    float4 MaterialAmbient;
    float4 MaterialDiffuse;
    float4 MaterialSpecular;
    float4 MaterialEmissive;
    float MaterialSpecularPower;
};

cbuffer LightVars : register (b1)
{
    float4 AmbientLight;
    float4 LightColor[4];
    float4 LightAttenuation[4];
    float3 LightDirection[4];
    float LightSpecularIntensity[4];
    uint IsPointLight[4];
    uint ActiveLights;
}

cbuffer ObjectVars : register(b2)
{
    float4x4 LocalToWorld4x4;
    float4x4 LocalToProjected4x4;
    float4x4 WorldToLocal4x4;
    float4x4 WorldToView4x4;
    float4x4 UVTransform4x4;
    float3 EyePosition;
};

cbuffer MiscVars : register(b3)
{
    float ViewportWidth;
    float ViewportHeight;
    float Time;
};
Заголовок Description
Практическое руководство. Экспорт текстуры, содержащей MIP-карты Описывает использование конвейера содержимого изображения для экспорта текстуры, содержащей предварительно рассчитанные MIP-карты.
Практическое руководство. Экспорт текстуры с предварительным умножением альфа-канала Описывает использование конвейера содержимого изображения для экспорта текстуры, содержащей значения с предварительным умножением альфа-канала.
Практическое руководство. Экспорт текстуры для использования с приложениями Direct2D или JavaScript Описывает использование конвейера содержимого изображения для экспорта текстуры, которую можно использовать в приложении Direct2D или JavaScript.
Работа с трехмерными ресурсами для игр и приложений Описываются инструменты, предоставляемые Visual Studio для создания трехмерных ресурсов и управления ими, включая текстуры и изображения, трехмерные модели и шейдеры.
Практическое руководство. Экспорт шейдера Описывает процесс экспорта шейдера из конструктора шейдеров.