Warum funktioniert QGLFramebufferObj. nicht in QGraphicsItem

Alles rund um die Programmierung mit Qt
Antworten
Student3000
Beiträge: 2
Registriert: 21. September 2010 18:41

Warum funktioniert QGLFramebufferObj. nicht in QGraphicsItem

Beitrag von Student3000 »

Hallo, ich habe immer noch das Problem, dass ein QGLFramebufferObject sich nicht in der Klasse QGraphicsItem-Klasse implementieren lässt.

Ich habe es jetzt mal anders versucht und bekomme folgende Meldung mit einem nicht korrekten Framebufferobject als Ausgabe (siehe auch Anhang).

QGLContext::chooseContext() : SetPixelFormat failed : The pixel format is invalid.

Der folgende Quellcode beschreibt wie ein QGLFramebufferObject in der QGraphicsItem::paint Methode erzeugt wird und anschließend in einer Szene gerendert wird.

header file:

Code: Alles auswählen

#ifndef __YidQt_FBOGraphicsItem_h__
#define __YidQt_FBOGraphicsItem_h__

#include <QGraphicsItem>
#include <QtOpenGL>


class FBOGraphicsItem : public QGraphicsItem
{

public:

	FBOGraphicsItem();

	// pure virtual functions from QGraphicsItem
	virtual QRectF boundingRect() const;
	virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);	

private:

	QGLContext *context;
	QGLFramebufferObject *fbo;

	QRectF myBoundingRect;
	float xx;
	float yy;

};

#endif // __YidQt_FBOGraphicsItem_h__
source file:

Code: Alles auswählen

void FBOGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{

	if (painter->paintEngine()->type() != QPaintEngine::OpenGL &&
        painter->paintEngine()->type() != QPaintEngine::OpenGL2)
    {
        qWarning("TestGLGraphicsItem: drawBackground needs a QGLWidget to be set as viewport on the graphics view");
        return;
    }

	float a1 = 0.5f * 1;
	float b1 = 0.5f * 1;

	
	// !!! error with this context !!!
	context = new QGLContext(QGLFormat(QGL::SampleBuffers | QGL::DoubleBuffer | QGL::AlphaChannel), widget);
	context->create(); // this line create an error: QGLContext::chooseContext() : SetPixelFormat failed
	context->makeCurrent();
	
	
	// ------------ FBO begin ------------
		
		fbo = new QGLFramebufferObject(512, 512);

		fbo->bind();
		{
			glPushAttrib(GL_ALL_ATTRIB_BITS);
			{
				glViewport(0, 0, fbo->size().width(), fbo->size().height());

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

				glMatrixMode(GL_PROJECTION);
				glPushMatrix();
				{
					glLoadIdentity();
					glOrtho(-1.0, 1.0, -1.0, 1.0, 99, -99);
					gluLookAt(0.0, 0.0, 1.0, 
							  0.0, 0.0, 0.0, 
							  0.0, 1.0, 0.0);
					
					glMatrixMode(GL_MODELVIEW);
					glPushMatrix();
					{
						glLoadIdentity();

						glColor3f(1.0f, 0.0f, 0.0f);
						glBegin(GL_QUADS);
							glVertex2f(-a1, -b1);
							glVertex2f(-a1,  b1);
							glVertex2f( a1,  b1);
							glVertex2f( a1, -b1);
						glEnd();

						// control points
						glPointSize(5.0f);	
						glColor3f(0.0f, 0.0f, 0.0f);
						glBegin(GL_POINTS);											
							glVertex3f(0.0f, 0.0f, 0.0f);

							glVertex3f(a1, 0.0f, 0.0f);
							glVertex3f(-a1, 0.0f, 0.0f);

							glVertex3f(0.0f, a1, 0.0f);
							glVertex3f(0.0f, -a1, 0.0f);

							glVertex3f(0.0f, 0.0f, a1);
							glVertex3f(0.0f, 0.0f, -a1);
						glEnd();
					}
					glMatrixMode(GL_MODELVIEW);
					glPopMatrix();
				}
				glMatrixMode(GL_PROJECTION);
				glPopMatrix();
			}
			glPopAttrib();
		}
		
		fbo->release();		
		fbo->toImage().save("d:\\fbo.bmp");

	// ------------ FBO end ------------
	

	// ------------ SZENE begin ------------
	
		painter->beginNativePainting();

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

		glMatrixMode(GL_PROJECTION);
		glPushMatrix();
		{
			glLoadIdentity();
			gluPerspective(70, WIDTH / HEIGHT, 0.01, 1000);

			glMatrixMode(GL_MODELVIEW);
			glPushMatrix();
			{
				glLoadIdentity();
				gluLookAt(0,0,1,
						  0,0,0,
						  0,1,0);

				glTranslatef(0, 0, 0);

				glEnable(GL_TEXTURE_2D);
				{
					glBindTexture(GL_TEXTURE_2D, fbo->texture());
					glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
					glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
					glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

					glBegin(GL_QUADS);
						glTexCoord2f(0.0f, 0.0f); glVertex2f(-xx, -yy);
						glTexCoord2f(0.0f, 1.0f); glVertex2f(-xx,  yy);
						glTexCoord2f(1.0f, 1.0f); glVertex2f( xx,  yy);
						glTexCoord2f(1.0f, 0.0f); glVertex2f( xx, -yy);
					glEnd();
				}
				glDisable(GL_TEXTURE_2D);					
			}
			glMatrixMode(GL_MODELVIEW);
			glPopMatrix();
		}
		glMatrixMode(GL_PROJECTION);
		glPopMatrix();

		painter->endNativePainting();

	// ------------ SZENE end ------------

}
Dateianhänge
problem.jpg
problem.jpg (178.21 KiB) 918 mal betrachtet
Student3000
Beiträge: 2
Registriert: 21. September 2010 18:41

Beitrag von Student3000 »

Lösung gefunden. Es lag an der Reihenfolge von painter->beginNativePainting();

Es steht nun vor der initialisierung des QGLContext und QGLFramebufferobject.

Die Message kommt trotzdem noch, aber das Resultat ist korrekt.

source

Code: Alles auswählen

	
	painter->beginNativePainting();
	
	// ------------ FBO begin ------------

		context = new QGLContext(QGLFormat(QGL::SampleBuffers | QGL::DoubleBuffer | QGL::AlphaChannel), widget);
		context->create(); // !!!
		context->makeCurrent();

		fbo = new QGLFramebufferObject(512, 512); // GLWidget::GLWidget (constructor)

		fbo->bind();
		{
			...
		}
		fbo->release();
		
Bild
Antworten