VBO 的 std::vector 偏移计算?

发布于 2024-12-12 18:26:41 字数 1523 浏览 0 评论 0原文

我使用带有交错数组的 VBO 来渲染加载的 obj(模型格式)iv。这可以用向量来代替吗? GL 代码使用向量,但向量向量的偏移量将完全不同。因此缓冲区无法正确地遍历向量。因此,什么也不呈现,只是被创造。 所以我的 VBO 的正常代码是(遗漏了一些不相关的位):

#define BUFFER_OFFSET(bytes) ( (GLubyte*) NULL + (bytes) )
    //define interleaved array
    GLfloat Cubedata[12][4] = 
    {
        //tu   tv     Cr     Cg     Cb     Ca     Nx     Ny     Nz     Vx     Vy     Vz
        +0.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, +0.5f, +0.5f,//top left     0
        +0.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, -0.5f, +0.5f,//bottom left  1
        +1.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, -0.5f, +0.5f,//bottom right 2
        +1.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, +0.5f, +0.5f //top right    3
    };
   //define other stuff

        //create vbo
        glGenBuffersARB(2, VBOid); //generates ids for the buffers
        glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOid[0]);//specifes the current buffer object
        glBufferDataARB(GL_ARRAY_BUFFER_ARB, ( (4 * 12) * sizeof(GLfloat) ), *Cubedata, GL_STATIC_DRAW_ARB);

        glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, BUFFER_OFFSET(0) );//set offsets
        //bind indicies
        //bind current buffer, render

这对于 GLfloat 类型的数组非常有效,但对于 GLfloat 向量则不然。向量定义需要有 12 列和第 n 行,例如:

vector< vector<GLfloat> > vec_interleaved(12,vector<GLfloat>(4) );

那么说到我的问题,如何计算向量的偏移量?在这种情况下,我希望缓冲区从每 12 个元素/每行的开头开始读取。

I'm using a VBO with an interleaved array to render a obj (model format) iv loaded. Is this possible to do with a vector instead? The GL code works with using a vector but the offset for a vector of vectors is going to be quite different. So the buffer doesn't step through the vector correctly. Therefore renders nothing but is created.
So my normal code for a VBO is(with some irrelevant bits missed out):

#define BUFFER_OFFSET(bytes) ( (GLubyte*) NULL + (bytes) )
    //define interleaved array
    GLfloat Cubedata[12][4] = 
    {
        //tu   tv     Cr     Cg     Cb     Ca     Nx     Ny     Nz     Vx     Vy     Vz
        +0.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, +0.5f, +0.5f,//top left     0
        +0.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, -0.5f, +0.5f,//bottom left  1
        +1.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, -0.5f, +0.5f,//bottom right 2
        +1.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, +0.5f, +0.5f //top right    3
    };
   //define other stuff

        //create vbo
        glGenBuffersARB(2, VBOid); //generates ids for the buffers
        glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOid[0]);//specifes the current buffer object
        glBufferDataARB(GL_ARRAY_BUFFER_ARB, ( (4 * 12) * sizeof(GLfloat) ), *Cubedata, GL_STATIC_DRAW_ARB);

        glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, BUFFER_OFFSET(0) );//set offsets
        //bind indicies
        //bind current buffer, render

this works perfectly for an array of GLfloat type but with a vector of GLfloat it doesnt. The vector definition needs to have twelve columns and nth rows such as:

vector< vector<GLfloat> > vec_interleaved(12,vector<GLfloat>(4) );

so getting to the point of my question, how do you calculate the offset for a vector? in this case I want the buffer to start reading from every 12 elements / the start of every row.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空城旧梦 2024-12-19 18:26:41

很简单,你不能。
向量的向量本质上是存储指向其他地方的内存的指针向量,因此不是连续的并且不能偏移。

您将需要使用多维数组;就像你已经一样。

Simply, you can't.
The vector of vectors is essentially storing a vector of pointers to memory elsewhere, and is therefore not contiguous and cannot be offset.

You will need to use a multi-dimensional array; as you are already.

亣腦蒛氧 2024-12-19 18:26:41

只需使用一维向量:

std::vector<float> data;
int data_width;

float atXY(std::vector<float> &v, int x, int y)
{
    return data[data_width*y + x];
}

从 std::vector 派生来添加多维支持是有意义的。当然,这是一个非常常见的任务,已经有人实现了。即Boost库有它:

http://www.boost.org/doc/libs/1_47_0/libs/multi_index/doc/index.html" boost.org/doc/libs/1_47_0/libs/multi_index/doc/index.html

Just use a one dimensional vector:

std::vector<float> data;
int data_width;

float atXY(std::vector<float> &v, int x, int y)
{
    return data[data_width*y + x];
}

It makes sense to derive from std::vector to add multidimensional support. But of course this is such a common task, that it has been implemented by somebody already. Namely the Boost libraries have it:

http://www.boost.org/doc/libs/1_47_0/libs/multi_index/doc/index.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文