在 OpenGL 中为多组数据使用单个缓冲区对象

Hay*_*igg 1 opengl

是否可以使用单个缓冲区来存储多种类型的数据?或者我应该使用两个缓冲区,其中一个存储顶点数据,另一个存储索引数据?

示例(使用单个缓冲区):

GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
// Buffer the Vertex Data
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
// Buffer the Index Data
Run Code Online (Sandbox Code Playgroud)

rat*_*eak 5

是的,这很好,也是交错存储的基础。每个缓冲区只是其他命令可以指向的一段内存。您甚至不需要GL_ELEMENT_ARRAY_BUFFER在设置数据时将其绑定到。

您必须确保数据不重叠:

GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
//allocate the buffer, passing in null just allocates
glBufferData(GL_ARRAY_BUFFER, vertexSize+indexSize*sizeof(int), 0, GL_STATIC_DRAW);
// Buffer the Index Data at the start of the buffer
glBufferSubData(GL_ARRAY_BUFFER, 0, indexSize*sizeof(int), indexData);
// Buffer the Vertex Data right after that
glBufferSubData(GL_ARRAY_BUFFER, indexSize*sizeof(int), vertexSize, vertexData);
Run Code Online (Sandbox Code Playgroud)

您需要偏移 glVertexAttribPointer 指针参数以指示它从哪里开始。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(vertex), (void*)(indexSize*sizeof(int)));
glVertexAttribPointer(1, 3, GL_FLOAT, false, sizeof(vertex), (void*)(indexSize*sizeof(int) + 3*sizeof(float)));
//...
Run Code Online (Sandbox Code Playgroud)

并且在绘图时,您需要传入正确的绘图偏移量(如果将其放在首位,则为 0,否则为您在相应glBufferSubData调用中指定的偏移量)

glDrawElements(GL_TRIANGLES?, indexSize, GL_UNSIGNED_INT?, 0);
Run Code Online (Sandbox Code Playgroud)