Stack Overflows And Disappearing DisplayLists

Started by
3 comments, last by Kincaid 18 years, 3 months ago
Hello, I'm working on an editor to place nature on landscapes. The Idea is kinda like billboarding, select an texture of some small plant/grass, and draw quad across the landsscape. This means many quads. Apart from framerate related problem; I got an stackoverflow when I projected about 20000 quads. So I thought up the following; - At each click start drawing a display list - the displaylist contains the 'new billboards' - start drawing a new display list - draw the old display list - draw the new display list toghether they contain all the nature which is added at each click. Still stackoverflow. (also got rid of pushMatrix() and popMatrix(), the overflow shifted in the code) So the problem is not in drawing, this goes well at each click, but in adding the nature elements in a linear list. Now I have a class with a base-list-element. from there I keep adding new items through new nextpointers in the list-elements. The stack overflow seems to come from very long recursive Next(list-item) calls, but definitily not inifinite. I know this is a 'general problem', but what is the main approach to making this work, calling things more than 30000+ times ?? But my openGl problem is yet another. The drawing part goes fine, but when about 70000 quads are drawn within the mainlist, it just disappears,nothing is projected anymore. a bit of code to specify; void StartCache ( ) { Cache_List = glGenLists(1); glNewList ( Cache_List, GL_COMPILE ); } void StopCache ( ) { glEndList(); } void JoinLists ( ) { int JoinedList = glGenLists(1); glNewList ( JoinedList, GL_COMPILE ); glCallList ( BoardList ); // boardlist is the displaylist, uptill now glCallList ( Cache_List ); glEndList ( ); BoardList = JoinedList; } void AddStuff () { StartCache( ); DrawStuff ( ); StopCache ( ); JoinLists ( ); glCallList( BoardList ); } So is there a limit to what a Display List can contain, which seems logical enough, and what is it, 70000+\-??? And is the problem here also created through stacking errors ?? Well, the basic question is, how the fudge do I project and add a hell of a lot of stuff to my scene ?
Advertisement
70000 quads is best done with an array kept either on the card or in memory, depending on how you update it, or maybe using instancing or any of several other techniques.

Read up on vertex arrays and also VBOs, at least.

If the list runs out of memory, the error state will be set to GL_OUT_OF_MEMORY. Check for errors at glEndList();

I don't see any queries that will give how big those can be. I assume that this is because different operations take different amounts of memory.
I know all aout vertex arrays. VBO's not yet, but I'll take a crack at them.
But still, it doesn't help with the stack overflow, because the vertex array data or VBO still has to be set. It's then when the problem presents otself. how to process that many numbers into an array??
and besides, my stuff is static, so lists serve my purposes best.
Arrays are reserved for dynamic data.
How do modern games project so many vertices? - apart from te real question, how to do it so fast as possible?

You should brush up on your GL basics - stack overflows here refer to the projection/modelview/texture matrix stacks within OpenGL's state machine (most probably the modelview), the vertex count is irrelevant. The minimum value for these is two for projection and texture, and 32 for modelview.

Check all occurances of pushMatrix and make sure they've all got a corresponding popMatrix. Also check that you're not exceeding the matrix depth at any given point (eg. more than 32 nested transformations, although thats unlikely). At the very least post what your DrawStuff function contains, as your problem likely lies within it.

(Also, it looks like you're creating lots of new display lists and discarding old ones without deleting them. This is sloppy and will likely cause problems later).
know my basics, as said, no matrix pushes or pops within the code anymore.
checked it, the problem shifted.
I am referring to the more general 'stack overflow'.
as to opengl, I asked another question.
Also, Im only creating 2 display lists at the time, and then join them.
deleting them seems only redundant to mention.
the drawstuff is, logically;
glBegin()
glvertex;
glVertex;
glVertex;
glVertex;
glEnd();
Just drawing a quad.

This topic is closed to new replies.

Advertisement