Из того, что я понял (из чтения различных страниц), есть 2 способа обновления буфера:
UpdateSubresource()
(когда буфер создается сDEFAULT
использованием)Map()
, скопируйте новые данные,Unmap()
(когда буфер создан сDYNAMIC
использованием)
В первом случае я вызываю только эту функцию (больше ничего)? Потому что я видел, как люди говорят, что они отображают буфер, а затем обновляют подресурс, или, может быть, я их неправильно понял.
И есть ли другой способ (сомневаюсь: P)? Я правильно понимаю вещи?
ID3D11ShaderResourceView * nullsrv = NULL; pCtx->PSSetShaderResources(0, 1, &nullsrv);
отменить привязку текстуры из слота 0.Возможно, они ссылались на фактический акт обновления ресурса, а не на фактический вызов функции. В общем случае UpdateSubResource следует использовать для ресурсов по умолчанию, которые не подлежат частым обновлениям (т.е. не для каждого кадра. В этом случае более вероятно, что буфер можно будет скопировать во временный буфер, доступный из буфера команд ( в связи с условиями гонок, например). Это также позволит вам обновлять вложенные ресурсы (в текстурах, например).
Map / Unmap следует использовать, когда ресурс будет обновляться очень часто (т. Е. Каждый кадр), например, некоторые постоянные буферы. Наиболее распространенным случаем является перезапись всего буфера с помощью WriteDiscard. Есть презентация nVidia, где они рекомендуют эту практику.
источник