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
Java 如何设置索引缓冲区对象_Java_Opengl_Lwjgl_Index Buffer - Fatal编程技术网

Java 如何设置索引缓冲区对象

Java 如何设置索引缓冲区对象,java,opengl,lwjgl,index-buffer,Java,Opengl,Lwjgl,Index Buffer,我正在尝试使用lwjgl(java OpenGL绑定)呈现一个基本模型。我正在尽可能多地利用我记忆中的知识来做这件事。我创建了一个vbo,如下所示: int verticesVBO = GL15.glGenBuffers ( ); vboIDs.add ( verticesVBO ); FloatBuffer verticesData = bufferFromData ( vertices );// Custom Method GL15.glBindBuffer

我正在尝试使用lwjgl(java OpenGL绑定)呈现一个基本模型。我正在尽可能多地利用我记忆中的知识来做这件事。我创建了一个vbo,如下所示:

    int verticesVBO = GL15.glGenBuffers ( );
    vboIDs.add ( verticesVBO );
    FloatBuffer verticesData = bufferFromData ( vertices );// Custom Method
    GL15.glBindBuffer ( GL15.GL_ARRAY_BUFFER , verticesVBO );
    GL15.glBufferData ( GL15.GL_ARRAY_BUFFER , verticesData , GL15.GL_STATIC_DRAW );
    GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);// Binds the vbo to the bound vao
    if(( error = GL11.glGetError()) != GL11.GL_NO_ERROR) System.err.println(GLU.gluErrorString(error));
我对索引缓冲区对象了解了这么多:

    int indicesVBO = GL15.glGenBuffers ( );
    vboIDs.add ( verticesVBO );
    IntBuffer indicesData = bufferFromData ( indices );
    GL15.glBindBuffer ( GL15.GL_ELEMENT_ARRAY_BUFFER , indicesVBO );
    GL15.glBufferData ( GL15.GL_ELEMENT_ARRAY_BUFFER , indicesData , GL15.GL_STATIC_DRAW );
    //Problem Here
    if(( error = GL11.glGetError()) != GL11.GL_NO_ERROR) System.err.println(GLU.gluErrorString(error));

我遇到的问题是,我不知道将索引缓冲区绑定到vao的方法。对于包含顶点数据的vbo,我知道要使用
GL20.glVertexAttributePointer(0,3,GL11.GL_FLOAT,false,0,0)但我记得索引缓冲区的行为不同。这是一个学习过程,因此请对您的批评持建设性态度。

您需要做的就是在绑定VAO时绑定索引缓冲区

见:

GL\u元素\u数组\u缓冲区

表格gl*Draw*元素的所有渲染功能*​ 将使用指针字段作为从绑定到此目标的缓冲区对象开始的字节偏移量。用于索引渲染的索引将取自缓冲区对象请注意,此绑定目标是顶点数组对象状态的一部分,因此在此处绑定缓冲区之前必须绑定VAO。


那么如何指定要绑定的属性列表呢?与执行包含法线或顶点数据的常规vbo时一样,您是否通常使用
GL20.glVertexAttributePointer()
中的第一个参数指定vao中的位置?例如
GL20.glvertexattributepointer(0,3,GL11.GL\u FLOAT,false,0,0)将占用vao中的第一个插槽。你如何告诉OpenGL索引缓冲区应该绑定到哪个插槽?@FeatheredOrcian:没有你正在讨论的东西(除了只有AMD支持的奇怪扩展)。顶点流从同一个索引中提取每个属性。@AndonM.Coleman我从未做过任何严肃的opengl编程,但我几乎可以肯定,可以在vao中的一个点绑定顶点数据,在另一个点绑定法线,在另一个点绑定索引,在另一个点绑定纹理词,等等。我确信vao就是这样工作的。如果它们不是这样工作的,那么将多个vbo绑定到一个vao有什么意义呢?@FeatheredOrcian索引缓冲区不绑定到属性。@immibis如果这是真的,那么可以解释很多问题