温馨提示:本文翻译自stackoverflow.com,查看原文请点击:graphics - Vulkan: Vertex Buffer doesn't get sent to vertex shader
3d graphics vulkan

graphics - Vulkan:顶点缓冲区不会发送到顶点着色器

发布于 2020-05-03 19:14:27

我正在学习Vulkan,开始遇到一个问题,即没有任何顶点可以显示。在使用RenderDoc(https://renderdoc.org/builds分析程序之后,我意识到包含顶点和索引信息的缓冲区包含权限值。 在此处输入图片说明

在同一缓冲区的末尾,索引数据: 在此处输入图片说明

问题是,当我检查传输到顶点着色器的数据时,它是空的: 在此处输入图片说明

这是应该将数据发送到着色器的命令缓冲区部分:

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);
}

如果您需要更多信息来帮助我解决问题,请告诉我。谢谢。

查看更多

提问者
Clément Bisaillon
被浏览
20
ratchet freak 2020-02-14 23:33

renderdoc报告的渲染索引很高。

在draw命令中indicesOffset传递vertexOffset这是:

vertexOffset是在索引到顶点缓冲区之前添加到顶点索引的值。

因此,将其替换为0,您应该再次获得正确的顶点。