我错过了什么。我已经成功设置了我的UBO缓冲区。在将数据存入缓冲区之后,一切都顺利进行。为了清理代码我试图创建一个将执行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按相反的顺序放置。
编辑:在循环时删除无用 - &gt;感谢DyP提供有关sizeof的提示...()
答案 0 :(得分:0)
最终成为那个
bufferUBOData(uboIndex, enabled, rotation, translation, scale);
的顺序不正确。应该是。
bufferUBOData(uboIndex, enabled, rotation, scale, translation);
我使用enum for offset [xxx]错过了一个细节。