【发布时间】:2019-03-29 22:57:35
【问题描述】:
我正在关注以下教程:Here。
我已经完成了加载模型,所以我的代码与那一点相似。
我现在正尝试将另一个结构传递给统一缓冲区对象,方法与之前显示的类似。
我创建了另一个在应用程序外部定义的结构来存储数据,如下所示:
struct Light{
alignas(16) glm::vec3 position;
alignas(16) glm::vec3 colour;
};
完成此操作后,我通过以下方式调整统一缓冲区大小:
void createUniformBuffers() {
VkDeviceSize bufferSize = sizeof(CameraUBO) + sizeof(Light);
...
接下来,在创建描述符集的时候,我在已经定义好的bufferInfo下面添加了lightBufferInfo,如下图:
...
for (size_t i = 0; i < swapChainImages.size(); i++) {
VkDescriptorBufferInfo bufferInfo = {};
bufferInfo.buffer = uniformBuffers[i];
bufferInfo.offset = 0;
bufferInfo.range = sizeof(UniformBufferObject);
VkDescriptorBufferInfo lightBufferInfo = {};
lightBufferInfo.buffer = uniformBuffers[i];
lightBufferInfo.offset = 0;
lightBufferInfo.range = sizeof(Light);
...
然后我将它添加到descriptorWrites 数组中:
...
descriptorWrites[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descriptorWrites[2].dstSet = descriptorSets[i];
descriptorWrites[2].dstBinding = 2;
descriptorWrites[2].dstArrayElement = 0;
descriptorWrites[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
descriptorWrites[2].descriptorCount = 1;
descriptorWrites[2].pBufferInfo = &lightBufferInfo;
...
现在与 UniformBufferObject 类似,我计划使用 updateUniformBuffer(uint32_t currentImage) 函数来更改灯光的位置和颜色,但首先我只是尝试将位置设置为所需的值:
void updateUniformBuffer(uint32_t currentImage) {
...
ubo.proj[1][1] *= -1;
Light light = {};
light.position = glm::vec3(0, 10, 10);
light.colour = glm::vec3(1, 1, 0);
void* data;
vkMapMemory(device, uniformBuffersMemory[currentImage], 0, sizeof(ubo), 0, &data);
memcpy(data, &ubo, sizeof(ubo));
vkUnmapMemory(device, uniformBuffersMemory[currentImage]);
}
我不明白在尝试将两个对象传递到统一缓冲区时偏移是如何工作的,所以我不知道如何将灯光对象复制到uniformBuffersMemory。
如何定义偏移量以使其正常工作?
【问题讨论】: