VBO 的 std::vector 偏移计算?
我使用带有交错数组的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
很简单,你不能。
向量的向量本质上是存储指向其他地方的内存的指针向量,因此不是连续的并且不能偏移。
您将需要使用多维数组;就像你已经一样。
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.
只需使用一维向量:
从 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:
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