I was wondering whether someone can help me find out why my JOGL code does not show a triangle. There are no exceptions for some reason. Am I missing something?
IntBuffer vacantNameBuffer = IntBuffer.allocate(3);
gl.glGenBuffers(1, vacantNameBuffer);
int vertexBufferName = vacantNameBuffer.get();
float[] triangleArray = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
FloatBuffer triangleVertexBuffer = FloatBuffer.wrap(triangleArray);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vacantNameBuffer.get());
gl.glBufferData(
GL2.GL_ARRAY_BUFFER,
triangleVertexBuffer.capacity() * Buffers.SIZEOF_FLOAT,
triangleVertexBuffer,
GL2.GL_STATIC_DRAW);
gl.glEnableVertexAttribArray(vacantNameBuffer.get());
gl.glVertexAttribPointer(0, 3, GL2.GL_FLOAT, false, 0, 0);
gl.glDrawArrays(GL2.GL_TRIANGLES, 0, 3);
gl.glDisableVertexAttribArray(vacantNameBuffer.get());
gl.glFlush();
As already mentioned in @ratchet_freak's answer, the arguments to
glEnableVertexAttribArray()
andglDisableVertexAttribArray()
need to be changed to pass the location of the attribute:Beyond that, you have some problems in how you use your buffer objects. You have these types of calls multiple times:
get()
is the relative get method, which gets the value at the current buffer position, and then advances the position. So without resetting the buffer position, it will only give you the first value in the buffer the first time you make this call.You already have a statement that gets the first value, and stores it in a variable:
All you need to do is use this value in the rest of the code, instead of calling
get()
again. So change this call:to this:
Another option would be to use
get(0)
, which gives you the value at an absolute position.glEnableVertexAttribArray
expects the attribute location (the number you set as first parameter ofglVertexAttribPointer
) so you should change it to: