Excellent Isaac, thanks!


On Mon, Mar 11, 2013 at 12:37 PM, Isaac Dupree <ml@isaac.cedarswampstudios.org> wrote:
On 03/11/2013 11:41 AM, Michael Baker wrote:
The concern that lead me to try OpenGLRaw
instead is that drawing every vertex/color/etc with a separate function
call seems incredibly inefficient. I imagine I'm going to have to learn
to use buffers at some point.

You are correct.  Partly for that reason, glBegin()/glEnd()/glVertex*() don't even exist in OpenGL ES and are deprecated since OpenGL 3.0.  It's a shame that so many OpenGL tutorials still teach them.

Note to others: your program depends on glfw-b (or anyway, Hackage 'glfw-b' works and Hackage 'glfw' doesn't).

glEnableVertexAttribArray/glVertexAttribPointer are for passing data to shader programs, I believe.  Everyone should use shader programs (GLSL).  GL without shader programs uses the "fixed-function pipeline" which is deprecated.  But I haven't used shaders yet, so I've attached how to do it with VBOs and the fixed-function pipeline.  I used glInterleavedArrays and glDrawArrays.  (That's probably not the only way to do it; OpenGL has lots of legacy and semi-redundant functions.)

As jean verdier noted, your byte count argument to glBufferData was wrong; "fromIntegral $ length verticies * sizeOf (head verticies)" fixes it.

Four coordinates per vertex is (as far as I know) not very useful for two-dimensional or three-dimensional shapes.

Doing glGenBuffers every frame without glDeleteBuffers leaks buffers. Either save them or delete them.  I didn't fix this. Control.Exception's bracket or bracket_ can be useful for this sort of thing.

I also attached a version that can attach a color to each vertex. Haskell FFI peeps, is there a better way to do this than writing a Storable instance for each GL buffer data layout?

-Isaac (who has been learning modern OpenGL for http://www.lasercake.net/ )


_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners