Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGl中,VBO是否必须包含具有相同顶点布局的数据?_Opengl_Vbo - Fatal编程技术网

在OpenGl中,VBO是否必须包含具有相同顶点布局的数据?

在OpenGl中,VBO是否必须包含具有相同顶点布局的数据?,opengl,vbo,Opengl,Vbo,我以前有很多VBO,但现在我把它们合并成一个,然后根据我画的内容索引到其中。问题是,当我将顶点加载到VBO并记录缓冲区中的字节数时,它与glDrawArrays中的参数不匹配,glDrawArrays的偏移量参数是“first”,而不是偏移量(字节)。如果VBO中的所有顶点都是相同的布局,我是否应该进行分割?例如,sizeof(Vertex)==12,它被放置在VBO中的字节偏移量48处,要绘制四个顶点,我是否需要执行gldrawArray(GL_TRIANGLE_STRIP,48/sizeof

我以前有很多VBO,但现在我把它们合并成一个,然后根据我画的内容索引到其中。问题是,当我将顶点加载到VBO并记录缓冲区中的字节数时,它与glDrawArrays中的参数不匹配,glDrawArrays的偏移量参数是“first”,而不是偏移量(字节)。如果VBO中的所有顶点都是相同的布局,我是否应该进行分割?例如,sizeof(Vertex)==12,它被放置在VBO中的字节偏移量48处,要绘制四个顶点,我是否需要执行gldrawArray(GL_TRIANGLE_STRIP,48/sizeof(Vertex),4)

如果它是一个大缓冲区,包含两种不同类型的顶点和不同的布局,该怎么办?当缓冲区被释放出来为其他缓冲区腾出空间,它们被移动或调整大小时,这应该怎么做


为了设置我调用GLVERTEXATTRIBPOINT和glEnableVertexArray四次或五次的顶点,我试图避免在每次绘制调用中调用这些顶点。

如果顶点的格式已更改,则这意味着(使用旧API),您必须进行一些
GLVERTEXATTRIBPOINT
调用(可能是要绑定的新VAO的一部分)以更改顶点数据的格式。无论哪种方式,调用此函数都可以更改缓冲区中每个属性开始的字节偏移量

因此,如果缓冲区在布局1中包含256字节的数据,然后在布局2中包含256字节的数据,则设置布局2时作为字节偏移量提供的“指针”应偏移256:新顶点数据的起始偏移量

这样,由于任何偏移都是顶点格式的一部分,因此
glDrawArrays
函数将两个网格的索引均为0

是的,
glDrawArrays
的“第一个”参数是索引,而不是字节偏移量

我试图避免每次抽签都打这些电话


如果要避免这种情况,则需要按顶点格式对模型进行排序,以便以一种格式渲染所有模型,然后使用另一种格式渲染模型。布局更改并不便宜,因此,如果性能很重要,请选择一小组顶点格式,并使网格与它们一致。

假设您在VBO中有一个缓冲区,您可以知道以字节为单位的偏移量是多少,如果你知道顶点布局,除法比重置glVertexAttrib指针要好得多,不是吗?我的意思是从字节偏移量到顶点索引“第一次”除法@Zebrafish:你的问题特别问到有两种不同的“布局”。根据定义,这意味着您必须再次调用
glvertexattributepointer
,或绑定新的VAO。