UBO 值在传递给着色器时更改值

UBO value changes value when passed to shader

我正在尝试使用 ImGui 滑块更新我的着色器中统一变量的值,但是我传入的值在 CPU 端是正确的,但是当它在 GPU 上时它变成负值.我举了一个例子来说明我是如何设置这一切的,其中 someVal 是传递给 GPU 的值,它代表我显示的图像中的 radius 值(命名已更改以帮助使事情更清楚).这就是我目前正在做的

static float ImGuiAdjustVal = 0.02f;

ImGui::SliderFloat("value: ", &ImGuiAdjustVal, 0.0f, 5.0f);

struct UniformObject {

    alignas(4) float someVal;
};

// update uniforms function

UniformObject ub{};
ub.someVal = ImGuiAdjustVal;

// both show same result and slider is able to adjust the value. The value just incorrectly makes it to the shader
std::cout << "Value: " << ImGuiAdjustVal << std::endl;
std::cout << "Sending to GPU" << ub.someVal << std::endl;

void* data;
vkMapMemory(device, uniformBufferMem[currentImage], 0, sizeof(ub), 0, &data);
memcpy(data, &ub, sizeof(ub));
vkUnmapMemory(device, uniformBufferMem[currentImage]);

// in my shader
layout(std140, binding = 1) uniform UniformObject {
  
    float someVal;
}ub;

float exampleProperty = ub.someVal;

在 renderDoc 中,我的值显示为 -0.00295 而不是 0.02 的设置值

如果我使用 ImGui::Slider 调整值,该值将在打印语句中更新,但该值将在 GPU 中保持 -0.00295。我已经通过使用滑块更改值并在 renderDoc 中捕获帧以查看值是否更改来对此进行了测试。但是,该值仍然如前所述 -0.00295

我正在接收一个设置为 64 的样本数组,但在我的着色器中我将其设置为 32。这导致我的其他变量接收到奇怪的值。

struct UBOStruct {
    alignas(16) vec3 samples[64];
    alignas(4) float radius;
}

// shader 
layout(std140, binding = 1) uniform UBOStruct {
   vec4 samples[32];
   float radius;

}ubo;

解决方案是确保正确接受所有值

struct UBOStruct {
   alignas(16) vec3 samples[64];
   alignas(4) float radius;
}

// shader 
layout(std140, binding = 1) uniform UBOStruct {
   vec4 samples[64];
   float radius;

}ubo;