Поделиться через


Типы ресурсов (Direct3D 10)

Все ресурсы, используемые конвейером Direct3D, являются производными от двух основных типов ресурсов: буферов и текстур. Буфер — это коллекция необработанных данных (элементов); Текстура — это коллекция текселей (элементов текстуры).

Существует два способа полностью указать макет ресурса (или объем памяти):

Позиция Description
Типизированных
Полностью укажите тип при создании ресурса.
Без типа
Полностью укажите тип, когда ресурс привязан к конвейеру.

 

Буферные ресурсы

Ресурс буфера — это коллекция полностью типизированных данных; внутри буфер содержит элементы. Элемент состоит из 1 до 4 компонентов. Примерами типов данных элементов являются упакованные значения данных (например, R8G8B8A8), одно 8-разрядное целое число, четыре 32-разрядных значения с плавающей запятой. Эти типы данных используются для хранения данных, таких как вектор положения, обычный вектор, координата текстуры в буфере вершин, индекс в буфере индекса или состоянии устройства.

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

Типы буферов

Буфер вершин

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

иллюстрация буфера вершин, содержащего данные о положении

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

иллюстрация буфера вершин, содержащего положение, обычные и текстурные данные

Этот буфер вершин содержит данные о вершинах для восьми вершин; каждая вершина хранит три элемента (координаты положения, нормальной и текстуры). Позиция и нормальное состояние обычно задаются с помощью трех 32-разрядных с плавающей запятой (DXGI_FORMAT_R32G32B32_FLOAT) и координат текстур с использованием двух 32-разрядных с плавающей запятой (DXGI_FORMAT_R32G32_FLOAT).

Чтобы получить доступ к данным из буфера вершин, необходимо знать, к какой вершине требуется получить доступ, и эти другие параметры буфера:

  • Смещение — число байтов с начала буфера до данных для первой вершины. Смещение предоставляется IASetVertexBuffers.
  • BaseVertexLocation — количество байтов от смещения до первой вершины, используемой соответствующим вызовом рисования (см . методы рисования).

Перед созданием буфера вершин необходимо определить его макет, создав объект входного макета. Это делается путем вызова CreateInputLayout. После создания объекта входного макета привязать его к этапу входной сборки путем вызова IASetInputLayout.

Чтобы создать буфер вершин, вызовите CreateBuffer.

Буфер индекса

Буфер индекса содержит последовательный набор 16-разрядных или 32-разрядных индексов; каждый индекс используется для идентификации вершины в буфере вершин. Использование буфера индекса с одним или несколькими буферами вершин для предоставления данных этапу IA называется индексированием. Буфер индекса можно визуализировать, как показано на следующем рисунке.

иллюстрация буфера индекса

Последовательные индексы, хранящиеся в буфере индекса, находятся со следующими параметрами:

  • Смещение — количество байтов с начала буфера до первого индекса. Смещение предоставляется IASetIndexBuffer.
  • StartIndexLocation — количество байтов от смещения до первой вершины, используемой соответствующим вызовом рисования (см . методы рисования).
  • IndexCount — количество индексов для отрисовки.

Чтобы создать буфер индекса, вызовите CreateBuffer.

Буфер индекса может объединить несколько линий или полос треугольников , разделив каждый из них с индексом с отрезкой. Индекс с вырезанным полосой позволяет нарисовать несколько полос линий или треугольников с помощью одного вызова рисования. Индекс с сокращением полосы — это просто максимально возможное значение индекса (0xffff для 16-разрядного индекса 0xffffffff для 32-разрядного индекса). Индекс среза сбрасывает порядок ветвления в индексированных примитивах и может использоваться для удаления необходимости дегенерации треугольников, которые в противном случае могут потребоваться для поддержания правильного порядка ветвления в полосе треугольника. На следующем рисунке показан пример индекса с сокращением полосы.

иллюстрация индекса с разделим

Буфер констант

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

иллюстрация буфера шейдер-констант

Каждый элемент хранит константу компонента 1–4, определяемую форматом хранимых данных.

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

Чтобы создать буфер константы шейдера, вызовите CreateBuffer и укажите флаг привязки констант-буфера D3D10_BIND_CONSTANT_BUFFER (см. D3D10_BIND_FLAG).

Чтобы привязать буфер шейдер-константы к конвейеру, вызовите один из следующих методов: GSSetConstantBuffers, PSSetConstantBuffers или VSSetConstantBuffers.

Обратите внимание, что при использовании интерфейса ID3D10Effect процесс создания, привязки и comitting буфера констант обрабатывается экземпляром интерфейса ID3D10Effect. В этом случае необходимо получить переменную только из эффекта с одним из методов GetVariable, таких как GetVariableByName, и обновить переменную одним из методов SetVariable, таких как SetMatrix. Пример использования интерфейса ID3D10Effect для управления буфером констант см . в руководстве 07.

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

Каждый этап шейдера позволяет до 15 буферов шейдер-констант; каждый буфер может содержать до 4096 констант.

Используйте буфер константы для хранения результатов этапа потокового вывода.

Сведения о объявлении буфера констант констант шейдера (DirectX HLSL) см. в примере объявления буфера констант в шейдере.

Ресурсы текстур

Ресурс текстуры — это структурированная коллекция данных, предназначенная для хранения текселей. В отличие от буферов текстуры, текстуры можно фильтровать по образцам текстур, так как они считываются единицами шейдера. Тип текстуры влияет на фильтрацию текстуры. Тексель представляет наименьшую единицу текстуры, которую можно читать или записывать в конвейер. Каждый тексель содержит от 1 до 4 компонентов, упорядоченных в одном из форматов DXGI (см. DXGI_FORMAT).

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

Типы текстур

Существует несколько типов текстур: 1D, 2D, 3D, каждая из которых может быть создана с mipmap или без них. Direct3D 10 также поддерживает массивы текстур и многофакторные текстуры.

1D Текстура

1D-текстура в простейшей форме содержит данные текстуры, которые можно устранить с помощью одной координаты текстуры; Его можно визуализировать как массив текселей, как показано на следующем рисунке.

иллюстрация 1d-текстуры

Каждый тексель содержит ряд компонентов цвета в зависимости от формата хранимых данных. Добавление дополнительной сложности позволяет создать 1D-текстуру с уровнями mipmap, как показано на следующем рисунке.

иллюстрация 1d-текстуры с уровнями mipmap

Уровень mipmap — это текстура, которая является мощностью двух меньше, чем выше уровня над ним. Самый верхний уровень содержит наиболее подробные сведения, каждый последующий уровень меньше; для 1D-MIP-карты наименьший уровень содержит один тексель. Различные уровни определяются индексом, называемым LOD (уровень детализации); LoD можно использовать для доступа к меньшей текстуре при отрисовке геометрии, которая не так близка к камере.

Массив текстур 1D

Direct3D 10 также имеет новую структуру данных для массива текстур. Массив 1D-текстур выглядит концептуально, как показано на следующем рисунке.

иллюстрация массива текстур 1d

Этот массив текстур содержит три текстуры. Каждая из трех текстур имеет ширину текстуры 5 (это число элементов в первом слое). Каждая текстура также содержит трехмерную карту mip.

Все массивы текстур в Direct3D представляют собой однородный массив текстур; это означает, что каждая текстура в массиве текстур должна иметь одинаковый формат и размер (включая ширину текстуры и количество уровней MIP-карты). Вы можете создавать массивы текстур разных размеров, если все текстуры в каждом массиве соответствуют размеру.

2D Текстура и массив текстур 2D

Ресурс Texture2D содержит 2D-сетку текселей. Каждый тексель предназначен для адреса с помощью вектора u, v. Так как это ресурс текстуры, он может содержать уровни MIP-карты и подресурсы. Полностью заполненный ресурс текстуры 2D выглядит следующим образом.

иллюстрация 2d-ресурса текстуры

Этот ресурс текстуры содержит одну текстуру 3x5 с тремя уровнями mipmap.

Ресурс Texture2DArray — это однородный массив двухмерных текстур; То есть каждая текстура имеет одинаковый формат данных и измерения (включая уровни mipmap). Он имеет аналогичный макет, как массив текстур 1D, за исключением того, что текстуры теперь содержат 2D-данные и, следовательно, выглядят следующим образом.

иллюстрация массива из 2d-ресурсов текстуры

Этот массив текстур содержит три текстуры; каждая текстура составляет 3x5 с двумя уровнями mipmap.

Использование Текстуры2DArray в качестве куба текстуры

Куб текстуры — это 2D-массив текстур, содержащий 6 текстур, по одному для каждого лица куба. Полностью заполненный куб текстуры выглядит следующим образом.

иллюстрация массива из 2d-ресурсов текстуры, представляющих куб текстуры

2D-массив текстур, содержащий 6 текстур, можно считывать из шейдеров с встроенными функциями карты куба после привязки к конвейеру с представлением текстур куба. Кубы текстуры устраняются из шейдера с трехмерными векторами, указывающими из центра куба текстуры.

Трехмерная текстура

Ресурс Texture3D (также известный как текстура тома) содержит трехмерный том текселей. Так как это ресурс текстуры, он может содержать уровни MIP-карты. Полностью заполненная трехмерная текстура выглядит следующим образом.

иллюстрация трехмерного ресурса текстуры

Если трехмерный срез mipmap текстуры привязан как целевой объект отрисовки (с представлением целевого представления отрисовки), трехмерная текстура работает одинаково с массивом текстур 2D с n срезами. Конкретный срез отрисовки выбирается на этапе геометрического шейдера, объявляя скалярный компонент выходных данных в качестве SV_RenderTargetArrayIndex системного значения.

Отсутствует концепция трехмерного массива текстур; поэтому подресурса трехмерной текстуры является одним уровнем MIP-карты.

Подресурсы

API Direct3D 10 ссылается на все ресурсы или подмножества ресурсов. Чтобы указать часть ресурсов, Direct3D применим термин подресурсов, что означает подмножество ресурса.

Буфер определяется как отдельный подресурс. Текстуры немного сложнее, так как существуют несколько различных типов текстур (1D, 2D и т. д.), которые поддерживают уровни mipmap и (или) массивы текстур. Начиная с самого простого случая текстура 1D определяется как один подресурс, как показано на следующем рисунке.

иллюстрация 1d-текстуры

Это означает, что массив текселей, составляющих 1D-текстуру, содержится в одном подресурсе.

Если развернуть трехмерную текстуру с тремя уровнями MIP-карты, ее можно визуализировать следующим образом.

иллюстрация 1d-текстуры с уровнями mipmap

Подумайте об этом как о одной текстуре, состоящей из трех подтекстов. Каждая подтекстовая структура считается подресурсом, поэтому эта 1D-текстура содержит 3 подресурса. Подтекст (или подресурс) можно индексировать с помощью уровня детализации (LOD) для одной текстуры. При использовании массива текстур для доступа к определенному подтексту требуется как LOD, так и конкретная текстура. Кроме того, API объединяет эти два фрагмента информации в один индекс подресурса на основе нуля, как показано здесь.

иллюстрация отсчитываемого от нуля индекса подресурсов

Выбор подресурсов

Некоторые API получают доступ ко всему ресурсу (например, CopyResource), другие получают доступ к части ресурса (например, UpdateSubresource или CopySubresourceRegion). API, обращающегося к части ресурса, обычно использует описание представления (например , D3D10_TEX2D_ARRAY_DSV) для указания подресурсов для доступа.

Эти цифры иллюстрируют термины, используемые описанием представления при доступе к массиву текстур.

Срез массива

Учитывая массив текстур, каждая текстура с mIP-картами, срез массива (представленный белым прямоугольником) включает одну текстуру и все его подтексты, как показано на следующем рисунке.

иллюстрация splice массива

Срез MIP

Срез mip (представленный белым прямоугольником) включает один уровень MIP-карты для каждой текстуры в массиве, как показано на следующем рисунке.

иллюстрация splice mip

Выбор одного подресурса

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

иллюстрация выбора подресурса с помощью среза массива и splice mip

Выбор нескольких подресурсов

Кроме того, можно использовать эти два типа срезов с количеством уровней mipmap и (или) количества текстур, чтобы выбрать несколько подресурсов.

иллюстрация выбора нескольких подресурсов

Независимо от типа текстуры, используемого с mipmap или без массива текстур, можно использовать вспомогательную функцию D3D10CalcSubresource для вычисления индекса определенного подресурса.

Строгая и слабая типизация

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

В меньшем типе ресурсов тип данных неизвестен при первом создании ресурса. Приложение должно выбрать доступный тип меньше форматов (см. DXGI_FORMAT). Необходимо указать размер памяти, который следует выделить, и нужно ли среде выполнения создавать подтексты в MIP-карте. Однако точный формат данных (будет ли память интерпретирована как целые числа, значения с плавающей запятой, неподписанные целые числа и т. д.) не определяется, пока ресурс не привязан к конвейеру с представлением. Так как формат текстуры остается гибким, пока текстура не привязана к конвейеру, ресурс называется слабо типизированным хранилищем. Слабо типизированное хранилище имеет преимущество, что оно может быть повторно использовано или переосмыслено (в другом формате), если бит компонента нового формата соответствует числу битов старого формата.

Один ресурс может быть привязан к нескольким этапам конвейера, если каждый из них имеет уникальное представление, которое полностью квалифициирует форматы в каждом расположении. Например, ресурс, созданный с помощью формата DXGI_FORMAT_R32G32B32A32_TYPELESS, можно использовать в качестве DXGI_FORMAT_R32G32B32A32_FLOAT и DXGI_FORMAT_R32G32B32A32_UINT одновременно в разных расположениях конвейера.

Ресурсы (Direct3D 10)