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;
我正在尝试使用 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;