PDA

View Full Version : Not using glutSwapBuffers



programmer17
01-16-2012, 09:02 PM
Hi. When I am trying to draw something it would not draw.
It would expect me to swaf the buffers.
However, it is very inconvinient as it will swap the buffer not once for the specific data I want but for everything.
How can write on the top buffer without swapping the buffers.

note: I have already swapped the buffers in other places. I am doing stuff on the front buffer now.

BionicBytes
01-17-2012, 07:27 AM
drawing to the front buffer is not recommended on Windows (7) platform because of the driver model.

What is it you are actually trying to do that requires drawing to the front buffer?
Would drawing to a FrameBufferObject be what you want to do - as that is supported and very well on many implementations.

programmer17
01-17-2012, 07:53 AM
sorry about the terminology.
I have drawn and now i need to use glutSwapBuffers(); to bring the thing to front. But since the function is called from the mouse function, the buffers swap each time i click. But i dont want that to happen.
How can i avoid it?

Alfonse Reinheart
01-17-2012, 09:21 AM
You gave yourself the answer:



But since the function is called from the mouse function, the buffers swap each time i click. But i dont want that to happen.

Don't call it from the mouse function. It's your code; if something's not being called from the right place, change it.

You should only swap buffers at the end of your drawing routine.

programmer17
01-17-2012, 10:03 AM
Yea but I have to since the function should be called when clicked. or should I make a new function? I will try it.

Alfonse Reinheart
01-17-2012, 10:08 AM
What you want is to have FreeGLUT call your display function when you click the mouse button. To do that, you call glutPostRedisplay. This tells FreeGLUT to call the display function when it gets the chance to do so.

programmer17
01-17-2012, 12:04 PM
I dont quite get it:
I have:

if (checknewgame == true)
{
int holder = checkcirclenumber( x ,y);
draw_userselected(holder);

} in my mouse function

void draw_userselected(int n)
{
if ((selected %4) == 0)
{
line++;
checkingcorrect();
}

point_t cor;
cor = computepoints( selected);
if (n ==1)
{
draw_colorcircles (cor.x, cor.y, 1, 0, 0,0.2);
}
else if (n ==2)
{
draw_colorcircles (cor.x, cor.y, 0, 0, 0,0.2);
}
else if (n ==3)
{
draw_colorcircles (cor.x, cor.y, 1, 1, 0,0.2);
}
else if (n ==4)
{
draw_colorcircles (cor.x, cor.y, 0, 1, 0,0.2);
}
else if (n ==5)
{
draw_colorcircles (cor.x, cor.y, 0, 0, 1,0.2);
}
else if (n ==6)
{
draw_colorcircles (cor.x, cor.y, 1, 1, 1,0.2);
}
}]
this is the drawinf function. what should I change?

mhagain
01-17-2012, 05:57 PM
Generally you should draw everything and swapbuffers every frame; it's the most efficient way, gives you the cleanest code, and your GPU will thank you for it. Tricks to get around it, like drawing to the front buffer or using an FBO, will only cause trouble longer term or introduce unnecessary complexity to solve what is really a very very simple problem.

So, the way forward from here is to rearchitect your code. If you want to draw something when the mouse is clicked, in your click event you just set a flag. Optionally also store the click location. Then when in your normal drawing routine you check if that flag is set and - if so - draw the object.

If you want multiple such objects you store each in a list of some kind (an std::vector would be perfect for this) and iterate through the list drawing them all.

Every frame: check input, record input events, draw entire scene, swap buffers.

Don't worry overmuch about performance at this stage - doing so is definitely in the realm of premature optimization (I bet you wouldn't even notice any difference anyway). Even a low-end GPU from a few years back is capable of drawing the kind of scene I bet you're drawing at a coupla thousand frames per second.

Alfonse Reinheart
01-17-2012, 07:25 PM
in my mouse function

Your mouse function should not be drawing anything at all. If things need to be drawn, your drawing function should draw them. Your mouse function should store whatever information you need to draw things at the proper place.

You should store `holder` in a global or something, then use `glutPostRedisplay` to cause your display code to be executed. That is where you should call `draw_userselected`