artoon
artoon

Reputation: 739

Draw in QGLFrameBufferObject

With Qt and opengl, I would like draw in a QGlFrameBufferObject ? I try this :

QGLFrameBufferObject * fbo = new QGLFramebufferObject(200, 200, QGLFramebufferObject::NoAttachment, GL_TEXTURE_2D, GL_RGBA32F);  
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, fbo->size().width(), fbo->size().height(), 0.0f, 0.0f, 1.0f);
fbo->bind();
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
fbo->release();
fbo->toImage().save("test.jpg"));

But I don't get a red image.

OTHER QUESTION

And if I want draw with :

glBegin(GL_QUAD); 
glColor3d(0.2, 0.5, 1.0); 
glVertex2i( 10, 20);
glColor3d(0.7, 0.5, 1.0); 
glVertex2i( 15, 20);
glColor3d(0.8, 0.4, 1.0); 
glVertex2i( 15, 25);
glColor3d(0.1, 0.9, 1.0); 
glVertex2i( 10, 25);
glEnd();

Do I need also glClear() ?

Upvotes: 1

Views: 524

Answers (1)

Reto Koradi
Reto Koradi

Reputation: 54642

You never actually clear the framebuffer. glClearColor() only sets the color used for clearing, but does not clear anything. You will need to add the second line here:

glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

The glClear() call will clear the color buffer with the clear color you specified in the first call. The framebuffer content is initially undefined, so you should always clear the framebuffer with a glClear() call before you start drawing. The only exception is if you're certain that the primitives you render will cover every pixel of the drawing surface. Even then, on some architectures it can actually be better for performance to still call glClear() first.

It shouldn't matter yet as long as you only clear the buffer. But once you want to start drawing, you will also need to set the viewport:

glViewport(0, 0, 200, 200);

Upvotes: 1

Related Questions