【发布时间】:2011-10-29 14:15:23
【问题描述】:
我正在使用带有交错数组的 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 个元素/每行的开头开始读取。
【问题讨论】:
-
我认为会有问题。当你有一个数组时,内存是连续的。对于矢量方案中的矢量,它不是。而且你也不能保证偏移量是连续的,因为向量中向量的内存是在堆上分配的。
-
为什么不直接做 vector
vec_interleaved(12 * 4) ? -
@Robert:我刚试过,检查数据是否正确进入向量,似乎没有什么不同。如果数组是在堆上定义的,那可以使用 vbo 吗?
-
@QuantumKarl 数据就是数据,不管它存储在哪里。您只是在寻找连续的数据。顺便说一句,sizeof(CubeData) 而不是 (4 * 12) * sizeof(GLfloat) 怎么样?
-
@Daniel & Banthar:好的,所以我将上面的代码更改为:vector
vec_interleaved(12*4); glBufferDataARB(GL_ARRAY_BUFFER_ARB, ( sizeof(vec_interleaved) * sizeof(GLfloat) ), &vec_interleaved, GL_STATIC_DRAW_ARB);唯一的问题是没有将向量转换为 GLvoid * 的方法,所以如果我将 &vec_interleaved 替换为 (GLvoid *)vec_interleaved 我会得到一个编译错误,所以它不可能吗? ://