Добавление более двух кубов DirectX12 - PullRequest
0 голосов
/ 28 марта 2020

Что я понимаю в данный момент:

  1. Создание устройства : доступ к видеоадаптеру (понял)
  2. Создание цепочки подкачки : создать поверхность рендеринга и обратные буферы, которые будут заменять (понял)
  3. Очередь команд, список команд, забор и т. д. c: насколько я понимаю, это список действий видео карта будет выполнять каждую итерацию (пока не получено)
  4. Объект состояния конвейера (получил):

    4.4. Root подпись : параметры, которые мы передадим функциям шейдеров

    4.5. Скомпилируйте существующие шейдеры : вроде бы понятно

    4.6. Формат ввода : объясните видеокарте, какова моя структура вершин

    4.7. Установите PSO, используя метод device (слишком длинный для записи) (возможно, для списка команд)

  5. Список вершин и индексов : создать массив структур ( соответственно тому, что мы отправили в PSO) и сохранили их, и там я запутался: мне нужно хранить его в памяти GPU - куча по умолчанию, но только GPU имеет доступ к этой памяти. Поэтому я создаю кучу по умолчанию (как, если у меня нет доступа?), Затем создаю кучу загрузки, сохраняю там ресурс (вершины) и добавляю команду в список команд для копирования из кучи загрузки в кучу по умолчанию. Вот как я это понимаю.

  6. Создание буфера глубины / трафарета : кажется, что материал не очень важен, плюс мне лень даже переводить «трафарет» из Engli sh (так, просто скопировал код из примера)

  7. Создание объектов . Здесь я сталкиваюсь с проблемой. Код:

``

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 вызовами.


Пожалуйста, поймите меня, если я не так понимаю, и объясните, почему я получаю исключение?


Узнайте здесь

...