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


Метод ID3D10Device::UpdateSubresource (d3d10.h)

ЦП копирует данные из памяти в подресурс , созданный в памяти без сопоставления. См. примечания.

Синтаксис

void UpdateSubresource(
  [in] ID3D10Resource  *pDstResource,
  [in] UINT            DstSubresource,
  [in] const D3D10_BOX *pDstBox,
  [in] const void      *pSrcData,
  [in] UINT            SrcRowPitch,
  [in] UINT            SrcDepthPitch
);

Параметры

[in] pDstResource

Тип: ID3D10Resource*

Указатель на целевой ресурс (см . id3D10Resource Interface).

[in] DstSubresource

Тип: UINT

Отсчитываемый от нуля индекс, определяющий целевой подресурс. Дополнительные сведения см. в разделе D3D10CalcSubresource .

[in] pDstBox

Тип: const D3D10_BOX*

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

Пустое поле приводит к тому, что операция будет недоступна. Поле пусто, если верхнее значение больше или равно нижнему значению, левое значение больше или равно значению справа либо переднее значение больше или равно обратному значению. Если поле пусто, UpdateSubresource не выполняет операцию обновления.

[in] pSrcData

Тип: const void*

Указатель на исходные данные в памяти.

[in] SrcRowPitch

Тип: UINT

Размер одной строки исходных данных.

[in] SrcDepthPitch

Тип: UINT

Размер одного среза глубины исходных данных.

Возвращаемое значение

None

Remarks

Для буфера констант шейдера; Присвойте pDstBox значение NULL. Этот метод нельзя использовать для частичного обновления буфера констант шейдера.

Ресурс нельзя использовать в качестве назначения, если:

При возврате updateSubresource приложение может изменять или даже освобождать данные, на которые указывает pSrcData, так как метод уже скопировал или прикрепить исходное содержимое.

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

  • При возникновении состязания за ресурс UpdateSubresource выполнит 2 копии исходных данных. Во-первых, данные копируются ЦП во временное дисковое пространство, доступное с помощью буфера команд. Это копирование происходит перед возвратом метода . Затем gpu выполняет вторую копию для копирования исходных данных в память без сопоставления. Вторая копия выполняется асинхронно, так как она выполняется GPU при очистке буфера команд.
  • Если нет состязания за ресурсы, поведение UpdateSubresource зависит от того, что быстрее (с точки зрения ЦП): копирование данных в буфер команд и последующее выполнение второй копии при очистке буфера команд или копирование ЦП в конечное расположение ресурса. Это зависит от архитектуры базовой системы.
Чтобы лучше понять параметры тона исходной строки и глубины исходной строки, рассмотрим следующую иллюстрацию текстуры объемного объема. Иллюстрация трехмерной текстуры объема

Каждый блок в этом визуальном элементе представляет элемент данных, а размер каждого элемента зависит от формата ресурса. Например, если формат ресурса DXGI_FORMAT_R32G32B32A32_FLOAT, размер каждого элемента будет составлять 128 бит или 16 байт. Эта текстура объемного объема имеет ширину 2, высоту 3 и глубину 4.

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

  • Исходный шаг строки = [размер одного элемента в байтах] * [количество элементов в одной строке]
  • Исходный шаг глубины = [Шаг исходной строки] * [количество строк (высота)]
В этом примере текстуры объемного тома, где размер каждого элемента составляет 16 байт, формулы будут следующими:
  • Шаг исходной строки = 16 * 2 = 32
  • Исходный шаг глубины = 16 * 2 * 3 = 96
На следующем рисунке показано, как ресурс находится в памяти. Иллюстрация текстуры объемного тома в памяти

Например, в следующем фрагменте кода показано, как указать конечную область в двухd-текстуре. Предположим, что текстура назначения — 512x512, и операция скопирует данные, на которые указывает pData, в [(120,100).. (200 220)] в конечной текстуре. Также предположим, что rowPitch инициализирован с правильным значением (как описано выше). Передний и задний имеют значение 0 и 1 соответственно, так как, если передняя часть равна задней, поле технически пусто.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 100;
destRegion.bottom = 220;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

1D-случай аналогичен. В следующем фрагменте кода показано, как указать конечную область в 1D-текстуре. Используйте те же предположения, что и выше, за исключением того, что текстура имеет длину 512.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Различия между Direct3D 10 и Direct3D 10.1:

Direct3D 10.1 позволяет использовать ресурсы трафарета глубины в качестве источника или назначения.

Требования

   
Целевая платформа Windows
Header d3d10.h
Библиотека D3D10.lib

См. также раздел

ID3D10Device

ИНТЕРФЕЙС ID3D10Resource