1

我错过了一些东西。我已经成功设置了我的 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...() 的提示

4

1 回答 1

0

结果就是这样

bufferUBOData(uboIndex, enabled, rotation, translation, scale);

顺序不正确。应该是的。

bufferUBOData(uboIndex, enabled, rotation, scale, translation);

我错过了使用偏移量 [xxx] 的枚举的一个细节。

于 2013-11-10T15:56:27.200 回答