Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ресурс — это коллекция данных, используемых конвейером трехмерных данных. Создание ресурсов и определение их поведения является первым шагом к программированию приложения. В этом руководстве рассматриваются основные разделы по выбору ресурсов, необходимых приложению.
- определить этапы конвейера, которые нуждаются в ресурсах
- определить, как будет использоваться каждый ресурс
- привязка ресурсов к этапам конвейера
- Связанные темы
Определение этапов конвейера, которым требуются ресурсы
Первым шагом является выбор этапа конвейера (или этапов), который будет использовать ресурс. То есть определите каждый этап, который будет считывать данные из ресурса, а также этапы, которые будут записывать данные в ресурс. Зная этапы конвейера, в которых будут использоваться ресурсы, определяют API, которые будут вызываться для привязки ресурса к этапу.
В этой таблице перечислены типы ресурсов, которые можно привязать к каждому этапу конвейера. Он включает, может ли ресурс быть привязан в качестве входных или выходных данных, а также API привязки.
| Этап конвейера | Вход и выход | Ресурс | Тип ресурса | Привязка API |
|---|---|---|---|---|
| Сборщик входных данных | В | Буфер вершин | Буфер | IASetVertexBuffers |
| Сборщик входных данных | В | Буфер индекса | Буфер | IASetIndexBuffer |
| Этапы шейдера | В | Shader-ResourceView | Буфер, Текстура1D, Текстура2D, Текстура3D | VSSetShaderResources, GSSetShaderResources, PSSetShaderResources |
| Этапы шейдера | В | буфер Shader-Constant | Буфер | VSSetConstantBuffers, GSSetConstantBuffers, PSSetConstantBuffers |
| Поток выходных данных | Вне | Буфер | Буфер | SOSetTargets |
| Слияние выходных данных | Вне | Представление целевого объекта отрисовки | Буфер, Текстура1D, Текстура2D, Текстура3D | OMSetRenderTargets |
| Слияние выходных данных | Вне | Отображение глубины/шаблона | Texture1D, Texture2D | OMSetRenderTargets |
Определение способа использования каждого ресурса
После выбора этапов конвейера, которые будет использовать приложение (и поэтому необходимые ресурсы), необходимо определить способ использования каждого ресурса, то есть доступ к ресурсу ЦП или GPU.
Оборудование, на котором работает приложение, будет иметь по крайней мере один ЦП и один GPU. Чтобы выбрать значение использования, подумайте, какой тип процессора должен выполнять чтение или запись в ресурс из следующих вариантов (см. D3D10_USAGE).
| Использование ресурсов | Может быть обновлено с помощью | Частота обновления |
|---|---|---|
| По умолчанию | Графический процессор | нечасто |
| Динамический | ЦПУ | часто |
| Подготовка | Графический процессор | n/a |
| Неизменный | центральный процессор (только в момент создания ресурса) | n/a |
Использование по умолчанию должно использоваться для ресурса, который, как ожидается, будет обновляться ЦП редко (менее одного раза на кадр). В идеале ЦП никогда не будет записывать напрямую в ресурс с использованием по умолчанию, чтобы избежать потенциального снижения производительности.
Динамическое использование следует применять для ресурса, который ЦП обновляет относительно часто (один или более раз за кадр). Типичным сценарием динамического ресурса будет создание динамических буферов вершин и индексов, которые будут заполнены во время выполнения данными о геометрии, видимой с точки зрения пользователя для каждого кадра. Эти буферы будут использоваться для отрисовки только геометрии, видимой пользователю для этого кадра.
Режим промежуточного использования следует применять для копирования данных в другие ресурсы и из них. Типичным сценарием будет копирование данных из ресурса с типовым использованием (к которому ЦП не может получить доступ) в ресурс для промежуточного использования (к которому ЦП может получить доступ).
Неизменяемые ресурсы следует использовать, когда данные в ресурсе никогда не изменятся.
Другой способ взглянуть на ту же идею заключается в том, чтобы подумать о том, что приложение делает с ресурсом.
| Как приложение использует ресурс | Использование ресурсов |
|---|---|
| Загрузите один раз и никогда не обновляйте | Неизменяемый или по умолчанию |
| Приложение заполняет ресурс многократно | Динамический |
| Отрисовка в текстуру | По умолчанию |
| Доступ ЦП к данным GPU | Подготовка |
Если вы не уверены, какое использование следует выбрать, начните с использования по умолчанию, так как это, как ожидается, будет наиболее распространенным случаем. Буфер Shader-Constant — это один тип ресурса, который всегда должен иметь использование по умолчанию.
Привязка ресурсов к этапам конвейера
Ресурс можно привязать к нескольким этапам конвейера одновременно, пока ограничения, указанные при создании ресурса (флаги использования, привязки флагов привязки, флаги доступа к ЦП) выполняются. В частности, ресурс может быть привязан в качестве входных данных и выходных данных одновременно, если чтение и запись части ресурса не могут произойти одновременно.
При привязке ресурса думайте о том, как GPU и ЦП будут получать доступ к ресурсу. Ресурсы, предназначенные для одной единственной цели (не используйте несколько видов использования, флаги привязки и доступа к ЦП), скорее всего, приведут к улучшению производительности.
Например, рассмотрим случай целевого объекта отрисовки, используемого в качестве текстуры несколько раз. Это может быть быстрее, чтобы иметь два ресурса: целевой объект отрисовки и текстуру, используемую в качестве ресурса шейдера. Каждый ресурс будет использовать только один флаг привязки (D3D10_BIND_RENDER_TARGET или D3D10_BIND_SHADER_RESOURCE). Данные будут скопированы из текстуры целевого рендеринга в текстуру шейдера с помощью CopyResource или CopySubresourceRegion. Это может повысить производительность, изолировав от чтения текстуры шейдера целевой объект отрисовки. Конечно, единственный способ быть уверенным – это реализовать оба подхода и измерить разницу в производительности в конкретном приложении.
Связанные разделы