
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