当我显式声明一个结构数组时,我的转换反馈循环工作得很好。

struct FeedBackInfo
    {
            float area;
            float Pabs;
            float Pref;
    }

FeedBackInfo FBI[36];
....
....
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0,sizeof(FBI), FBI);

但是,我不想将自己限制在为示例程序创建的36点框内,并且可以根据加载的模型进行放大。但是当我试图切换到一个可以动态分配的向量对象时,我无法获得转换反馈。
struct FeedBackInfo
{
    float area;
    float Pabs;
    float Pref;
};

std::vector<FeedBackInfo> FBI;
FBI.resize(36);
....
....

这将彻底失败
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0,sizeof(FBI), &FBI);

这将只填充偏移庄园中的一些值
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0,sizeof(FBI), &FBI[0]);

我甚至不能在0到35之间填写所有的数据,只有填写的区域。
我不明白为什么结构数组的显式声明会顺利工作,为什么将它转换成向量对象突然不起作用。
有没有一种方法可以动态地分配FeedBackInfo的结构,并且仍然可以顺利地与转换反馈循环一起工作?

最佳答案

std::vector<FeedBackInfo> FBI;
FBI.resize(36);

你的sizeof(FBI);不会是你想要的内存大小。
如果你想有内存的大小(数据的大小,而不是向量的大小),你需要使用FBI.size()*sizeof(FeedBackInfo)
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, FBI.size()*sizeof(FeedBackInfo), FBI.data());

我把你的“抄送”改成了“抄送”,因为我觉得读起来更好。。

09-04 16:58