Java OpenGL交错VBOs跨步和偏移
我正在制作这个需要渲染彩色四边形的程序。 我正在使用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
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吗