[SOLVED] VBO and Shaders

Hey everybody, new here and I’m in a bit of a pickle. I have been researching VBOs for a couple weeks now and have gotten stuck. I cannot get the VBO to render when I use glVertexAttribPointer() and enable shaders. I don’t think I have to call glGenArrays(), but I’m not sure. Anyway I’ve attached the relevant code below.

Edit: I’m using JOGL

Init VBO code:


//=====================================
//VERTEX ARRAY===========================		
//=====================================
FloatBuffer vertex_data = Buffers.newDirectFloatBuffer(m_vertices.length);
vertex_data.put(m_vertices);
vertex_data.flip();

gl.glGenBuffers(1, m_vbo_handle, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, m_vbo_handle[0]);
gl.glBufferData(GL.GL_ARRAY_BUFFER, m_vertices.length * Buffers.SIZEOF_FLOAT, vertex_data, GL.GL_STATIC_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

		
//=====================================
//COLOR ARRAY===========================	
//=====================================
FloatBuffer color_data = Buffers.newDirectFloatBuffer(m_vertices.length);
color_data.put(color_array);
color_data.flip();

gl.glGenBuffers(1, m_rgb_handle, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, m_rgb_handle[0]);
gl.glBufferData(GL.GL_ARRAY_BUFFER, m_vertices.length * Buffers.SIZEOF_FLOAT, color_data, GL.GL_STATIC_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

//=====================================
//TEXCOORD ARRAY========================	
//=====================================
FloatBuffer tex_coord_data = Buffers.newDirectFloatBuffer(m_uvs.length);
tex_coord_data.put(m_uvs);
tex_coord_data.flip();

gl.glGenBuffers(1, m_tcd_handle, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, m_tcd_handle[0]);
gl.glBufferData(GL.GL_ARRAY_BUFFER, m_uvs.length * Buffers.SIZEOF_FLOAT, tex_coord_data, GL.GL_STATIC_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
		
//=====================================
//INDEX ARRAY============================		
//=====================================
IntBuffer index_data = Buffers.newDirectIntBuffer(index_array.length);
index_data.put(index_array);
index_data.flip();

gl.glGenBuffers(1, m_ind_handle, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, m_ind_handle[0]);
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, index_array.length * Buffers.SIZEOF_INT, index_data, GL.GL_STATIC_DRAW);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
		
//Don't forget to save the number of indices so we can draw!
m_num_indices = index_array.length;

Draw code:


int vert_pos = gl.glGetAttribLocation(engine.m_simple_shader.program_index, "vert_pos");
int color = gl.glGetAttribLocation(engine.m_simple_shader.program_index, "color");
			
engine.m_simple_shader.useShader(gl);//This uses my own shader class, it works, I promise
			
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, m_vbo_handle[0]);
gl.glVertexAttribPointer(vert_pos, 3, GL.GL_FLOAT, false, 0, 0L);
gl.glEnableVertexAttribArray(vert_pos);

gl.glBindBuffer(GL.GL_ARRAY_BUFFER, m_rgb_handle[0]);
gl.glEnableVertexAttribArray(color);
gl.glVertexAttribPointer(color, 3, GL.GL_FLOAT, false, 0, 0L);
			
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, m_ind_handle[0]);
gl.glDrawElements(GL.GL_TRIANGLES, m_num_indices, GL.GL_UNSIGNED_SHORT, 0);
			
gl.glDisableVertexAttribArray(vert_pos);
gl.glDisableVertexAttribArray(color);

Vertex Shader:


in vec3 vert_pos;
in vec3 color;
out vec3 pass_color;

void main(void)
{
   gl_Position = gl_ModelViewMatrix * vec4(vert_pos.x, vert_pos.y, vert_pos.z, 1.0);
   pass_color = color;
}

Frag Shader:


in vec3 pass_color;
out vec4 out_color;

void main(void)
{
   out_color = vec4(pass_color.x, pass_color.y, pass_color.z, 1.0);
   gl_FragColor = out_color;
}

I can get this to render using the deprecated glEnableClientState() way, so my indices/vertices/color/texcoord generation is/should be fine. I am also sure that my Shader class code works as I’ve used it another project. So linking and using the shader shouldn’t be a problem. (I’ve also bound the vert_pos and color attribs to 4 and 5, and I get those as the returned value).

Any help would be appreciated, thanks!