Page 1 of 1

opengl og vertex arrays?

Posted: 10 Aug 2010, 08:57
by rasmuskaae
hejsa

jeg har lidt problemer med følgende kode:

Code: Select all


#ifdef _DEBUG
	assert(glVertexPointer!=0);
	assert(glDrawArrays!=0);
	GLint value;
	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &value);
	assert(value>0);
#endif
	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(particles.size(), GL_FLOAT, 0, particle_array);
	glDrawArrays(GL_POINTS, 0, particles.size());
	glDisableClientState(GL_VERTEX_ARRAY);
Problemet er at programmet crasher i funktionen "glDrawArrays" med noget der minder om en null pointer exception. Jeg har forsøgt med alle størrelser af "particles"-array (alt fra 0-100.000). Når jeg indsætter 0 kører programmet fint mens det allerede ved 1 crasher.

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 11:23
by Crisium
can you please show us the particle_array creation

regards,
Peter Wraae Marino

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 11:36
by rasmuskaae

Code: Select all

 std::vector<particle> particles;
 ....
 particle * particle_array = &particles[0];

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 11:37
by Crisium
rasmuskaae wrote:

Code: Select all

 std::vector<particle> particles;
 ....
 particle * particle_array = &particles[0];
and the particle object please...

peter

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 11:39
by rasmuskaae

Code: Select all

class particle {
public: 
float x,y,z;
}

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 11:52
by Crisium
rasmuskaae wrote:

Code: Select all

class particle {
public: 
float x,y,z;
}

ok.. great.. now I can get started...
I don't know what your default memory alignment is or what compile/platform you are on.. so I'm assuming windows.

float x,y,z; is normal 12 byes aligned .. if you default alignment is 16 or 32 you will have some empty memory between your values.. try putting a pragma that aligns the memory to 1 (4 should work too with your example)

then change the following:

glVertexPointer(particles.size(), GL_FLOAT, 0, particle_array);

to

glVertexPointer(3, GL_FLOAT, 0, particle_array);

good luck,
peter

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 12:19
by rasmuskaae
d'oh, i read the size parameter as count :-)

thanks

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 17:45
by ZeroHero
Jeg tror ikke OpenGL tillader en array af klasser, selv om klassen kun indeholder 3 floats!
Vil tro det er bedst at bruge en lang array af floats.

float * particle_array = new float [ Antal * 3 ];

du vil herefter kunne kalde glVertexPointer() saaledes:

glVertexPointer( 3, GL_FLOAT, 0, particle_array);
glEnableClientState( GL_VERTEX_ARRAY );
glDrawArrays( GL_POINTS, 0, Antal * 3 );
glDisableClientState( GL_VERTEX_ARRAY );

Muligvis vil det vaere en fordel at bruge homogene vektorer da det senere hen vil blive lettere for dig at multiplicere med 4x4 matrix.

Re: opengl og vertex arrays?

Posted: 10 Aug 2010, 22:09
by Gorm
ZeroHero wrote:Jeg tror ikke OpenGL tillader en array af klasser, selv om klassen kun indeholder 3 floats!

Prøv hvad Crisium skriver; måske går det godt ;) . Så læs lidt op på low-level ting, som memory layouts af klasser og structs, casts, og den slags. Mange af OpenGL funktionerne er præcist lavet så det giver mening at caste f.eks til en float *, ved at man kan angive et stride mellem sine værdier. Præcis hvad Crisium skriver om :-)

Re: opengl og vertex arrays?

Posted: 11 Aug 2010, 07:15
by rasmuskaae
ZeroHero wrote:Jeg tror ikke OpenGL tillader en array af klasser, selv om klassen kun indeholder 3 floats!
Vil tro det er bedst at bruge en lang array af floats.
følgende tre datastrukturer har samme memorymodel:

Code: Select all

typedef struct { float x,y,z; } mm1;
class mm2 { public: float x,y,z; } mm2;
typedef float[3] mm3;
hvilket gør at følgende giver god mening:

Code: Select all

mm2 * m2 = new mm2[100];
mm1 * m1 = (mm1*)m2;
float * m3 = (float*)m2;
som nævnt ovenfor, var det blot et spørgsmål om at jeg havde fejl-læst i opengl manualen :-)