我正在渲染具有大量数据点(> 1M)的网格结构。我的数据结构在图片中。
所以我的索引缓冲区的内容看起来像这样0, 100, 1, 101, 2, 102, 3, 103, ...
我对我需要定义我的三角形条的索引缓冲区的巨大尺寸感到有点恼火。是否有可能告诉 OpenGL 以所示方式自动生成这些索引?或者也许我没有想到的 glVertexAttribPointer 的一些技巧?
我正在渲染具有大量数据点(> 1M)的网格结构。我的数据结构在图片中。
所以我的索引缓冲区的内容看起来像这样0, 100, 1, 101, 2, 102, 3, 103, ...
我对我需要定义我的三角形条的索引缓冲区的巨大尺寸感到有点恼火。是否有可能告诉 OpenGL 以所示方式自动生成这些索引?或者也许我没有想到的 glVertexAttribPointer 的一些技巧?
确实有这样的功能:glDrawElementsBaseVertex
因此您可以使用以下方法绘制它们:
for(int i=0; i < height-1; i++){
glDrawElementsBaseVertex(GL_TRIANGLE_STRIP, 200, GL_UNSIGNED_INT, 0, i*100);
}
那么索引缓冲区就是:0, 100, 1, 101, 2, 102, 3, 103,... 98, 198, 99, 199
通过一些调整,您甚至可以使用glMultiDrawElementsBaseVertex
:
GLsizei *count = new GLsizei[height-1];
GLvoid **indices = new GLvoid[height-1];
GLint *basevertex = new GLint[height-1];
for(int i = 0; i< height-1; i++){
count[i]=200;
indices[i]=0;
basevertex[i]=i*100;
}
glMultiDrawElementsBaseVertex(GL_TRIANGLE_STRIP, count, indices, height-1, basevertex);
我能找到的最佳解决方案是使用 glMultiDrawElementsIndirect。缓冲区大小比原始缓冲区小很多,您可以通过一次 gl 调用传递所有绘制命令。感谢derhass的提示!