可变参数模板函数和glBufferData

时间:2013-11-07 15:27:42

标签: opengl c++11 variadic-functions

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

1 个答案:

答案 0 :(得分:0)

最终成为那个

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

的顺序不正确。应该是。

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

我使用enum for offset [xxx]错过了一个细节。