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


Выбор ресурса (Direct3D 10)

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

Определение этапов конвейера, которым требуются ресурсы

Первым шагом является выбор этапа конвейера (или этапов), который будет использовать ресурс. То есть необходимо определить каждый этап, который будет считывать данные из ресурса, а также этапы, которые будут записывать данные в ресурс. Знание этапов конвейера, на которых будут использоваться ресурсы, определяет API, которые будут вызываться, чтобы привязать ресурс к этапу.

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

Этап конвейера В/Из Ресурс Тип ресурса API привязки
Сборщик входных данных В Буфер вершин Буфер IASetVertexBuffers
Сборщик входных данных В Буфер индексов Буфер IASetIndexBuffer
Этапы шейдера В Представление ресурсов шейдера Буфер, Texture1D, Texture2D, Texture3D VSSetShaderResources, GSSetShaderResources, PSSetShaderResources
Этапы шейдера В Буфер констант шейдера Буфер VSSetConstantBuffers, GSSetConstantBuffers, PSSetConstantBuffers
Выходной поток Исходящий Буфер Буфер SOSetTargets
Средство слияния выхода Исходящий Представление целевого объекта отрисовки Буфер, Texture1D, Texture2D, Texture3D OMSetRenderTargets
Средство слияния выхода Исходящий Представления глубины/трафарета Texture1D, Texture2D OMSetRenderTargets

 

Определение способа использования каждого ресурса

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

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

Использование ресурсов Возможность обновления Частота обновления
Значение по умолчанию Графический процессор редко
Динамический ЦП часто
Промежуточная Графический процессор Недоступно
Неизменяемые ЦП (только во время создания ресурсов) Недоступно

 

Использование по умолчанию следует использовать для ресурса, который, как ожидается, будет обновляться ЦП достаточно редко (реже, чем раз в кадр). В идеале ЦП никогда не будет выполнять прямую запись в ресурс с использованием по умолчанию, чтобы избежать возможного снижения производительности.

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

Промежуточное использование должно использоваться для копирования данных в другие ресурсы и из них. Типичный сценарий заключается в копировании данных из ресурса с использованием по умолчанию (недоступного для ЦП) в ресурс с промежуточным использованием (доступный для ЦП).

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

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

Использование ресурса приложением Использование ресурсов
Однократная загрузка, отсутствие обновлений Неизменяемое или по умолчанию
Приложение многократно заполняет ресурс Динамический
Отрисовка в текстуру Значение по умолчанию
Доступ ЦП к данным графического процессора Промежуточная

 

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

Привязка ресурсов к этапам конвейера

Ресурс может быть привязан к нескольким этапам конвейера одновременно, если соблюдаются ограничения, указанные при создании ресурса (флаги использования, флаги привязки, флаги доступа к ЦП). В частности, ресурс можно привязать как входной и выходной объект одновременно, при условии что запись и чтение ресурса не могут осуществляться одновременно.

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

Например, рассмотрим случай с однобуферной прорисовкой, используемой в качестве текстуры несколько раз. Возможно, работа пойдет быстрее с двумя ресурсами: однобуферной прорисовкой и текстурой, используемой в качестве ресурса шейдера. Каждый ресурс будет использовать только один флаг привязки (D3D10_BIND_RENDER_TARGET или D3D10_BIND_SHADER_RESOURCE). Данные будут скопированы из целевой текстуры рендеринга в текстуру шейдера с помощью CopyResource или CopySubresourceRegion. Это может повысить производительность, изолировав запись цели отрисовки от считываемой текстуры шейдера. Конечно, единственный способ убедиться — реализовать оба подхода и измерить разницу в производительности в конкретном приложении.

Ресурсы (Direct3D 10)