Как настроить объект индексного буфера
Я пытаюсь сделать базовую модель с помощью 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.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
но я помню, что индексные буферы вели себя по-разному. Это учебный процесс, поэтому, пожалуйста, будьте конструктивны с вашей критикой.
1 ответ
Все, что вам нужно сделать, это привязать индексный буфер, пока VAO привязан.
См. https://www.opengl.org/wiki/Buffer_Object:
GL_ELEMENT_ARRAY_BUFFER
Все функции рендеринга вида gl*Draw*Elements* будут использовать поле указателя в качестве байтового смещения от начала объекта буфера, привязанного к этой цели. Индексы, используемые для индексированного рендеринга, будут взяты из объекта буфера. Обратите внимание, что эта цель привязки является частью состояния объектов Vertex Array, поэтому VAO должен быть привязан перед привязкой буфера здесь.