我错过了一些东西。我已经成功设置了我的 UBO 缓冲区。在 memcpy'ing 数据进入缓冲区后,一切正常。为了清理代码,我正在尝试创建一个执行 memcpy 和缓冲的函数。我的函数如下所示:
void bufferUBOData(const GLuint uboIndex)
{
auto uboSize = sizeRegistry.find(uboIndex)->second;
auto buffer = bufferRegistry.find(uboIndex)->second;
glBufferData(GL_UNIFORM_BUFFER, uboSize, buffer, GL_DYNAMIC_DRAW);
}
template<typename T, typename... Args>
void bufferUBOData(const GLuint uboIndex, T data, Args... args)
{
auto buffer = bufferRegistry.find(uboIndex)->second;
auto size = std::get<1>(dataRegistry.find(uboIndex)->second);
auto offset = std::get<2>(dataRegistry.find(uboIndex)->second);
auto type = std::get<3>(dataRegistry.find(uboIndex)->second);
const int index = sizeof...(args);
memcpy(buffer + offset[index], &data, size[index] * TypeSize(type[index]));
bufferUBOData(uboIndex, args...);
}
为了实现代码,我做了以下事情。
//memcpy(buffer + offset[Scale], &scale, size[Scale] * TypeSize(type[Scale]));
//memcpy(buffer + offset[Translation], &translation, size[Translation] * TypeSize(type[Translation]));
//memcpy(buffer + offset[Rotation], &rotation, size[Rotation] * TypeSize(type[Rotation]));
//memcpy(buffer + offset[Enabled], &enabled, size[Enabled] * TypeSize(type[Enabled]));
//glBufferData(GL_UNIFORM_BUFFER, uboSize, buffer, GL_DYNAMIC_DRAW);
bufferUBOData(uboIndex, enabled, rotation, translation, scale);
一切都编译。在上面的代码部分中,如果我取消注释 memcpy 和 glBufferData 调用并注释掉 bufferUBOData 调用,一切正常。但是,所示示例呈现空白屏幕(无几何图形)。
注意:当我使用 bufferUBOData 函数时,我将 args 以相反的顺序放置。
编辑:删除了无用的 while 循环 --> 感谢 DyP 关于 sizeof...() 的提示