是否可以使用单个缓冲区来存储多种类型的数据?或者我应该使用两个缓冲区,其中一个存储顶点数据,另一个存储索引数据?
示例(使用单个缓冲区):
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)
是的,这很好,也是交错存储的基础。每个缓冲区只是其他命令可以指向的一段内存。您甚至不需要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)