PDA

View Full Version : problems with glVertexPointer



Lord crc
04-02-2001, 05:06 AM
Hi

Im storing my vertices in an array, where each vertex is x,y,z,w: float

now, if i pass the w component like this

glVertexPointer(4, GL_FLOAT, 0, my_vertices)

all looks good, however if i do something like this

glVertexPointer(3, GL_FLOAT, 4, my_vertices)

my mesh gets messed up.

since i got the w for my normals too, using
glNormalPointer(GL_FLOAT, 4, my_normals)

makes it all messed up

any ideas as to what can be wrong?

Nutty
04-02-2001, 07:31 AM
glVertexPointer(3, GL_FLOAT, 4, my_vertices) is incorrect. The stride argument should be in bytes, so it should be 16 not 4.

That should fix it.

Nutty

Deiussum
04-02-2001, 07:47 AM
Also, there is no w component for normals. Normals will always be 3 elements each. The value 4 that you are passing for glNormalPointer is wrong too. That's the stride, not the number of components. It should be 12. (3 floats * 4 bytes/float)

Using glVertexPointer(3, GL_FLOAT, 4, my_vertices) Is saying that you only have x,y,z (the first parameter is how many components) and as Nutty pointed out, sets the stride to 4. So unless you changed your vertices to not have a w, you should do this.

glVertexPointer(4, GL_FLOAT, 16, my_vertices)

Nutty
04-02-2001, 10:51 AM
Using glVertexPointer(3, GL_FLOAT, 16, my_verts); will also work, it will just ignore the w component.

Get rid of the W, as you rarely need to specify that anyway, and use

glVertexPointer(3, GL_FLOAT, 0, myverts);
or
glVertexPointer(3, GL_FLOAT, 12, myverts);

both will work, as your xyz will be tightly packed with no w.

personally I prefer to specify the stride explicitly.

Nutty

Lord crc
04-02-2001, 11:11 AM
if you're going to do matrix transformations yourself, you need the W component in both cases. (im using ogl for this, just reusing my matrix lib since i just started)

i see now what i missinterpreted, thanks for the heads up.

zed
04-02-2001, 01:22 PM
the third value is the stride. ie the byte offset between the vertices. i assume u supply the data without any gaps so you need to use zero offset

glVertexPointer(4, GL_FLOAT, 0, my_vertices);

Nutty
04-02-2001, 11:35 PM
The byte offset between vertices on 4 floats, is 16. The reason you can put 0 in, is because of a tiny little extra feature of that function. If verts are tightly packed, you can put 0 in, and gl will automatically calculate the correct stride.

As I said, I personally prefer to specify it explicity.

I think alot of people get confused on this. They know it works with 0, so they think gl is measuring the byte difference between vert(n).z and vert(n+1).x When it's not, it's the difference between vert(n).x and vert(n+1).x

Nutty

P.S. Why do you need to specify the W component if you write your own matrix code?

Lord crc
04-03-2001, 03:15 AM
that was exactly what i was confusing it with. and the wording in the msdn doc's doesnt quite help (in my view): "The byte offset between consecutive vertices. When stride is zero, the vertices are tightly packed in the array"

the last part could be rewritten to cause less confusion.

anyway, why i need W? and so i can transform the vectors and vertices with the same matrix (and matrix function) and perform perspective correction.

thanks for the help, its all running perfectly now