Что я понимаю в данный момент:
- Создание устройства : доступ к видеоадаптеру (понял)
- Создание цепочки подкачки : создать поверхность рендеринга и обратные буферы, которые будут заменять (понял)
- Очередь команд, список команд, забор и т. д. c: насколько я понимаю, это список действий видео карта будет выполнять каждую итерацию (пока не получено)
Объект состояния конвейера (получил):
4.4. Root подпись : параметры, которые мы передадим функциям шейдеров
4.5. Скомпилируйте существующие шейдеры : вроде бы понятно
4.6. Формат ввода : объясните видеокарте, какова моя структура вершин
4.7. Установите PSO, используя метод device
(слишком длинный для записи) (возможно, для списка команд)
Список вершин и индексов : создать массив структур ( соответственно тому, что мы отправили в PSO) и сохранили их, и там я запутался: мне нужно хранить его в памяти GPU - куча по умолчанию, но только GPU имеет доступ к этой памяти. Поэтому я создаю кучу по умолчанию (как, если у меня нет доступа?), Затем создаю кучу загрузки, сохраняю там ресурс (вершины) и добавляю команду в список команд для копирования из кучи загрузки в кучу по умолчанию. Вот как я это понимаю.
Создание буфера глубины / трафарета : кажется, что материал не очень важен, плюс мне лень даже переводить «трафарет» из Engli sh (так, просто скопировал код из примера)
Создание объектов . Здесь я сталкиваюсь с проблемой. Код:
``
for (int i = 0;i<frameBufferCount; i++)
{
hr = device->CreateCommittedResource( &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
// this heap will be used to upload the constant buffer data
D3D12_HEAP_FLAG_NONE, // no flags
&CD3DX12_RESOURCE_DESC::Buffer(1024 * 64), // size of the resource heap. Must be a multiple of 64KB for single-textures and constant buffers
D3D12_RESOURCE_STATE_GENERIC_READ, // will be data that is read from so we keep it in the generic read state
nullptr, // we do not have use an optimized clear value for constant buffers
IID_PPV_ARGS(&constantBufferUploadHeaps[i]));
constantBufferUploadHeaps[i]->SetName(L"Constant Buffer Upload Resource Heap");
ZeroMemory(&cbPerObject, sizeof(cbPerObject));
CD3DX12_RANGE readRange(0, 0); // We do not intend to read from this resource on the CPU. (so end is less than or equal to begin) // map the resource heap to get a gpu virtual address to the beginning of the heap
hr = constantBufferUploadHeaps[i]->Map(0, &readRange, reinterpret_cast<void**>(&cbvGPUAddress[i]));
// Because of the constant read alignment requirements, constant buffer views must be 256 bit aligned. Our buffers are smaller than 256 bits,
// so we need to add spacing between the two buffers, so that the second buffer starts at 256 bits from the beginning of the resource heap.
for (int ii = 0; ii < 1000;ii++)
memcpy(cbvGPUAddress[i] + ConstantBufferPerObjectAlignedSize*ii, &cbPerObject, sizeof(cbPerObject));
}
// Now we execute the command list to upload the initial assets (triangle data)
commandList->Close();
ID3D12CommandList* ppCommandLists[] = { commandList };
commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);
Когда я делаю, например, менее 100, все работает нормально, но с 1000 исключениями программы выдает при вызове memcpy
:
0xC0000005: access violation while trying to write address 0x1B31A008
В Update()
у меня тоже есть тот же l oop, а в UpdatePipeline()
у меня есть l oop с DrawIndexedInstanced
вызовами.
Пожалуйста, поймите меня, если я не так понимаю, и объясните, почему я получаю исключение?
Узнайте здесь