Java Opengl使用1个缓冲区存储所有顶点数据

Java Opengl使用1个缓冲区存储所有顶点数据,java,lwjgl,Java,Lwjgl,我用所有顶点数据(位置、纹理坐标、法线)创建了1个浮点缓冲区和1个vbo,它们存储如下: bf.put(vertices[i].position.x); bf.put(vertices[i].position.y); bf.put(vertices[i].position.z); bf.put(vertices[i].texCoords.x); bf.put(vertices[

我用所有顶点数据(位置、纹理坐标、法线)创建了1个浮点缓冲区和1个vbo,它们存储如下:

            bf.put(vertices[i].position.x);
            bf.put(vertices[i].position.y);
            bf.put(vertices[i].position.z);
            bf.put(vertices[i].texCoords.x);
            bf.put(vertices[i].texCoords.y);
            bf.put(vertices[i].normals.x);
            bf.put(vertices[i].normals.y);
            bf.put(vertices[i].normals.z);
如何使用GLVertexAttribute指针将它们传递到着色器

是否可以执行以下操作:

 glEnableVertexAttribArray(0);

            glBindBuffer(GL_ARRAY_BUFFER, vbo);
            glVertexAttribPointer(/*arguments for sending position*/);
 glEnableVertexAttribArray(1);

            glBindBuffer(GL_ARRAY_BUFFER, vbo);
            glVertexAttribPointer(/*arguments for sending texture coordinates*/);

glEnableVertexAttribArray(2);

            glBindBuffer(GL_ARRAY_BUFFER, vbo);
            glVertexAttribPointer(/*arguments for sending normals*/);
?


如果是,请帮助我理解glvertexattributepointer以及我应该输入的参数。

您用于属性的数据排列通常称为“交错”,实际上是在VBO中存储多个属性的推荐方式。它支持本地数据访问,因为顶点的所有属性在内存中都相邻,这反过来又会导致高速缓存命中率高

让我们看看
glvertexattributepointer()
的签名,然后更详细地解释参数。我有意不抄袭文档中的解释,希望其他措辞能帮助您更好地理解它们。在LWJGL中,其定义为:

static void glVertexAttribPointer(
    int index, int size, int type, boolean normalized,
    int stride, long pointerOffset)
  • index
    :顶点着色器中顶点属性的位置,如使用
    glBindAttribLocation()
    指定的,通过
    glGetAttribLocation()
    获取,或在着色器代码中使用
    位置
    布局限定符指定的
  • size
    :属性中的组件数。例如,3个用于具有3个坐标的位置,2个用于具有2个组件的纹理坐标,等等
  • 类型
    :属性的类型。主要是
    GL\u FLOAT
  • normalized
    :浮点属性不重要,如果您开始使用整型属性,请仔细阅读
  • stride
    :后续顶点之间的间距(以字节为单位)。除非顶点之间有填充(这是相当罕见的),否则这与顶点的大小(以字节为单位)相同
  • pointerOffset
    :由于历史原因,它的名称中有“pointer”,但实际上是属性第一次出现时相对于缓冲区开始的字节偏移量。在交错排列中,这对应于顶点内属性的偏移量(以字节为单位)
在您的例子中,
stride
将是32,因为每个顶点由8个浮点组件组成,每个浮点组件有4个字节

第一个属性的
pointerOffset
为0,其余所有属性的相对字节偏移量均为0,剩余两个属性的偏移量分别为12和20

这就需要调用您的示例:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * 4, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 8 * 4, 3 * 4);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 8 * 4, (3 + 2) * 4);

有关参数,请参见“我已经阅读了文档,但无法使用vbo使其工作”,我需要一个示例。