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