Java OpenGL交错VBOs跨步和偏移

Java OpenGL交错VBOs跨步和偏移,java,opengl,vbo,Java,Opengl,Vbo,我正在制作这个需要渲染彩色四边形的程序。 我正在使用VBOs进行此操作 这就是我存储顶点和颜色数据的方式: 渲染四元组: buff.put(3 floats color) render the quad (3 floats per vertex * 4 per face * 6 per quad) 现在,正如您所看到的,我的目标是使用交错VBO,但我无法计算出步幅和偏移量 以下是渲染时的调用: buff.put(3 floats color) render the quad (3 f

我正在制作这个需要渲染彩色四边形的程序。 我正在使用VBOs进行此操作

这就是我存储顶点和颜色数据的方式:

渲染四元组:

 buff.put(3 floats color)
 render the quad (3 floats per vertex * 4 per face * 6 per quad) 
现在,正如您所看到的,我的目标是使用交错VBO,但我无法计算出步幅和偏移量

以下是渲染时的调用:

 buff.put(3 floats color)
 render the quad (3 floats per vertex * 4 per face * 6 per quad) 
(请注意,我使用的是映射的VBO,这就是没有实际数据绑定的原因):

glBindBufferARB(GL_ARRAY_BUFFER_ARB,etn.getVboHandel());

glBufferDataARB(GL_ARRAY_BUFFER_ARB,etn.getVboData().capacity()步长是两个元组之间的空间大小,偏移量是0和第一个元组的第一次出现之间的空间大小

例如,对于每个位置有3个浮动的三角形,然后对于法线有3个浮动,看起来是这样的

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 24, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 24, (GLvoid*) (sizeof(float)*3));
glEnableVertexAttribArray(1);
因此,顶点指针的偏移量为0(假设前三个条目是位置),跨距为24(假设顶点颜色直接位于顶点位置之后)

对于颜色指针,偏移量将为
(GLvoid*)(sizeof(float)*3)
,因为在第一个颜色三元组之前有三个glfloat

这一切都假设交错阵列是这样构建的

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 24, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 24, (GLvoid*) (sizeof(float)*3));
glEnableVertexAttribArray(1);
vvccvccvccc等


< C++中的一个非常简单的例子,使用一个只有顶点和普通信息的模型以及面,你可以检查这个代码:

步长是两个元组之间的空间是多少,偏移量是0和第一元组的第一次出现之间的空间是多少? 例如,对于每个位置有3个浮动的三角形,然后对于法线有3个浮动,看起来是这样的

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 24, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 24, (GLvoid*) (sizeof(float)*3));
glEnableVertexAttribArray(1);
因此,顶点指针的偏移量为0(假设前三个条目是位置),跨距为24(假设顶点颜色直接位于顶点位置之后)

对于颜色指针,偏移量将为
(GLvoid*)(sizeof(float)*3)
,因为在第一个颜色三元组之前有三个glfloat

这一切都假设交错阵列是这样构建的

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 24, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 24, (GLvoid*) (sizeof(float)*3));
glEnableVertexAttribArray(1);
vvccvccvccc等


< C++中的一个非常简单的例子,使用一个只有顶点和普通信息的模型以及面部,你可以检查这个代码:

你的描述不是很一致:每个顶点的3个浮点不足以描述一个3D位置和一个RGB颜色。你的代码表明你实际上每个顶点有6个值,所以缓冲区可能是像

    +0    +4    +8    +12   +16   +20
 0: pos.x pos.y pos.z col.r col.g col.b
24: pos.x pos.y pos.z col.r col.g col.b
...
步幅是同一属性的两个连续值的“距离”,因此在本例中,它是-正如您正确设置的那样- 6*sizeof(GLfloat)。偏移量是属性相对于缓冲区开头的字节偏移量。在我的示例中,pos为0,col为3*sizeof(GLfloat)。您将两者设置为相同的偏移量,因此对不同的属性使用相同的数据,这很少是一个好主意

此外,您的缓冲区设置似乎不清楚

glDrawArrays(GL_QUADS, 0,  etn.getVboData().capacity());
建议
etn.getVboData().capacity()
是缓冲区中的顶点数。如果是

glBufferDataARB(GL_ARRAY_BUFFER_ARB, etn.getVboData().capacity() << 2, GL_STATIC_DRAW_ARB);

glBufferDataARB(GL_ARRAY\u BUFFER_ARB,etn.getVboData().capacity()您的描述并不完全一致:每个顶点3个浮点数不足以描述3D位置和RGB颜色。您的代码表明,实际上每个顶点有6个值,因此缓冲区可能看起来像

    +0    +4    +8    +12   +16   +20
 0: pos.x pos.y pos.z col.r col.g col.b
24: pos.x pos.y pos.z col.r col.g col.b
...
步幅是同一属性的两个连续值的“距离”,因此在本例中,它是-正如您正确设置的那样- 6*sizeof(GLfloat)。偏移量是属性相对于缓冲区开头的字节偏移量。在我的示例中,pos为0,col为3*sizeof(GLfloat)。您将两者设置为相同的偏移量,因此对不同的属性使用相同的数据,这很少是一个好主意

此外,您的缓冲区设置似乎不清楚

glDrawArrays(GL_QUADS, 0,  etn.getVboData().capacity());
建议
etn.getVboData().capacity()
是缓冲区中的顶点数。如果是

glBufferDataARB(GL_ARRAY_BUFFER_ARB, etn.getVboData().capacity() << 2, GL_STATIC_DRAW_ARB);

glBufferDataARB(GL_ARRAY_BUFFER_ARB,etn.getVboData().capacity())此处缺少太多信息,无法回答此问题。不清楚您试图做什么。例如,“3”的颜色是什么意思是?另外,停止使用ARB后缀。缓冲区对象是GL 1.5功能;它们已经是OpenGL的核心十多年了。我删除了ARB后缀。这里缺少太多信息,无法回答这个问题。不清楚您正在尝试做什么。例如,“3浮动的颜色”是什么意思是?另外,停止使用ARB后缀。缓冲区对象是GL 1.5功能;它们已经成为OpenGL的核心十多年了。我删除了ARB后缀。东西是四元的,不能有超过1种不同的颜色,这意味着每4*6个顶点调用只需要1种颜色,所以它的构建方式如下:VVVVVV CI不太确定,但或者必须按顶点设置,而不是按四边形设置。如果四边形(在OpenGL中是一个平面)每个顶点都有不同的颜色,颜色将在平面上插值。三角形也是如此。因此,如果你的四边形只有一种颜色,四边形上的每个顶点都需要相同的颜色。哦,好的,谢谢!你能帮我了解另一个人关于容量的说法吗?容量就是集合中有多少条目四元体不能有超过1种不同的颜色,这意味着每4*6个顶点调用只需要1种颜色,因此其构建方式如下:VVVVVV CI不太确定,但颜色必须按顶点设置,而不是按四元体设置。如果四元体(在OpenGL中是一个平面)每个顶点都有不同的颜色,颜色将在平面上插值。三角形也是如此。因此,如果你的四边形只有一种颜色,四边形上的每个顶点都需要相同的颜色。哦,好的,谢谢!你能帮我说说其他人对容量的看法吗?容量只是集合中有多少条目我不知道理解关于容量的部分。你能进一步解释并使用jav吗