GLSL 变换反馈返回数组与矢量

GLSL Transform Feedback return Array vs Vector

本文关键字:数组 返回 变换 GLSL      更新时间:2023-10-16

当我显式声明一个结构数组时,我的转换反馈循环可以完美地工作。

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());

我用FBI.data()代替了你的&FBI[0],因为我认为阅读更好。