Vulkan: Vertex Buffer не отправляется на вершинный шейдер - PullRequest
0 голосов
/ 14 февраля 2020

Я изучаю Vulkan и у меня возникла проблема, когда вершины не отображались. После анализа моей программы с помощью RenderDo c (https://renderdoc.org/builds) я понял, что буфер, содержащий информацию о вершине и индексе, содержит значения прав. enter image description here

В конце того же буфера данные индексов: enter image description here

Проблема заключается в том, что при проверке данные, которые передаются в вершинный шейдер, пустые: enter image description here

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

VkDeviceSize indicesOffset = sizeof(Vertex) * this->nbVertices;
VkDeviceSize offsets[] = {0};

vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, &this->vertexBuffer, offsets);
vkCmdBindIndexBuffer(commandBuffers[i], this->vertexBuffer, indicesOffset, VK_INDEX_TYPE_UINT32);

for(size_t j = 0 ; j < this->models.size() ; j++){
    Model *model = this->models[j];
    uint32_t modelDynamicOffset = j * static_cast<uint32_t>(this->uniformDynamicAlignment);

    VkDescriptorSet* modelDescriptorSet =  model->getDescriptorSet(i);
    vkCmdBindDescriptorSets(this->commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, modelDescriptorSet, 1, &modelDynamicOffset);

    vkCmdDrawIndexed(commandBuffers[i], this->nbIndices, 1, 0, indicesOffset, 0);
}

Кроме того, вот как я создаю буфер вершин:

void Application::createVertexBuffers() {
for(Model *model : this->models){
    for(Vertex vertex : model->getVertices()){
        vertices.push_back(vertex);
    }
    for(uint32_t index : model->getIndices()){
        indices.push_back(index);
    }
}

VkDeviceSize vertexBufferSize = sizeof(vertices[0]) * vertices.size();
VkDeviceSize indexBufferSize = sizeof(uint32_t) * indices.size();

this->nbVertices = vertices.size();
this->nbIndices = indices.size();

VkBuffer stagingBuffer;
VkDeviceMemory stagingBufferMemory;


//To CPU
this->createBuffer(vertexBufferSize + indexBufferSize,
                          VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
                          VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
                          stagingBuffer,
                          stagingBufferMemory);
void *data;
vkMapMemory(device, stagingBufferMemory, 0, vertexBufferSize, 0, &data);
memcpy(data, vertices.data(), (size_t)vertexBufferSize);
vkUnmapMemory(device, stagingBufferMemory);

//Add the index data after vertex data
vkMapMemory(device, stagingBufferMemory, vertexBufferSize, indexBufferSize, 0, &data);
memcpy(data, indices.data(), (size_t)indexBufferSize);
vkUnmapMemory(device, stagingBufferMemory);

//To GPU
this->createBuffer(vertexBufferSize + indexBufferSize,
                          VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
                          VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
                          this->vertexBuffer,
                          this->vertexBufferMemory);

this->copyBuffer(stagingBuffer, this->vertexBuffer, vertexBufferSize + indexBufferSize);

vkDestroyBuffer(device, stagingBuffer, nullptr);
vkFreeMemory(device, stagingBufferMemory, nullptr);
}

Если вам нужна дополнительная информация, чтобы помочь мне решить мою проблему, пожалуйста, сообщите мне. Спасибо.

1 Ответ

1 голос
/ 14 февраля 2020

Индексы рендеринга c для рендеринга немного высоки.

Вы передаете indicesOffset как vertexOffset в вашей команде рисования. Что:

vertexOffset - это значение, добавляемое к индексу вершины перед индексацией в буфер вершин.

Так что замените его на 0, и вы должны снова получить нужные вершины .

...