QGLWIdget

Alles rund um die Programmierung mit Qt
Antworten
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

QGLWIdget

Beitrag von Uwe82 »

Hallo,

meine OpenGL Anwendung wurde unter Linux entwickelt und funktioniert da auch wunderbar (Siehe Anhang).

Die Portierung für Windows bringt leider das Problem mit sich, dass scheinbar die Tiefenreihenfolge ignoriert wird und alles schwarz weiss ist. Der Code ist unter Linux und Windows gleich.

Vielleicht weiß jemand von euch auf Anhieb, was es sein könnte.

Viele Grüße,
Uwe82
Dateianhänge
Linux, alles ok
Linux, alles ok
linux.jpg (109.06 KiB) 8002 mal betrachtet
Windows, nur schwarz/weiß und Tiefenreihenfolge ignoriert
Windows, nur schwarz/weiß und Tiefenreihenfolge ignoriert
windows.PNG (26.79 KiB) 8002 mal betrachtet
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Wo ist der Code?
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

Beitrag von Uwe82 »

InitOpenGL

Code: Alles auswählen

// make GLWidget to current GL environment
makeCurrent();

static const GLfloat lightPos[4] = { 5.0f, 5.0f, 10.0f, 0.0f };

glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);

glEnable(GL_NORMALIZE);

// set material color
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);

// activate blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

SetBackgroundColor( 1.0, 1.0, 1.0 );


// setup matrix for perspective view

// choose projection Matrix
glMatrixMode(GL_PROJECTION);

// load identity matrix
glLoadIdentity();

// create perspective matrix
gluPerspective(m_FOV, GLdouble(m_iGLWindowSizeX) / GLdouble(m_iGLWindowSizeY), 0.1, 100.0);

// set OpenGL view port
glViewport(0, 0, m_iGLWindowSizeX, m_iGLWindowSizeY);




paintGL

Code: Alles auswählen


GLfloat pPos[] = { 5.0f, 5.0f, 5.0f, 0.0f };
GLfloat pAmbient[] = { 0.6f, 0.6f, 0.6f, 0.0f };
GLfloat pDiffuse[] = { 0.9f, 0.9f, 0.9f, 0.0f };

// delete current scene
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// select model matrix
glMatrixMode(GL_MODELVIEW);

// load identity matrix
glLoadIdentity();

// transform default OpenGL coordinate system into typical robotic system
glRotated(-90.0, 1.0, 0.0, 0.0);
glRotated(-90.0, 0.0, 0.0, 1.0);

glLightfv(GL_LIGHT0, GL_POSITION, pPos);
glLightfv(GL_LIGHT0, GL_AMBIENT, pAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, pDiffuse);
	
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);


DrawCoordinateSystem();

// execute GL commands now
glFlush();
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ich bin mir nicht sicher, ob die beiden Fälle (Farben und Z-Buffer) wirklich zusammenhängen.. könnten auch zwei Probleme sein.

Hast du mal unter Windows versucht, das ganze ohne LIGHTING laufen zu lassen?
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

Beitrag von Uwe82 »

Ich denke auch, dass das zwei unterschiedliche Probleme sein könnten.

Habe jetzt unter Windows die Beleuchtung deaktiviert. Das Ergebnis ist auf jeden Fall schonmal bunt. Der Hintergrund sollte eigentlich weiß sein. Der Depth Buffer scheint unabhängig kaputt zu sein.

Hier nochmal init

Code: Alles auswählen


// create new object for GLU (do checking later)
m_pQuadric = gluNewQuadric();

// make GLWidget to current GL environment
makeCurrent();

glEnable( GL_DEPTH_TEST );
glEnable( GL_NORMALIZE );

SetBackgroundColor( 1.0, 1.0, 1.0 );

// setup matrix for perspective view
SetupPerspective();


und paintGL

Code: Alles auswählen

// delete current scene
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

// select model matrix
glMatrixMode( GL_MODELVIEW );

// load identity matrix
glLoadIdentity();

// transform default OpenGL coordinate system into typical robotic system
glRotated( -90.0, 1.0, 0.0, 0.0 );
glRotated( -90.0, 0.0, 0.0, 1.0 );

// execute GL commands now
glFlush();

Dateianhänge
windows, lichter deaktiviert
windows, lichter deaktiviert
windows_lights_off.png (13.32 KiB) 7955 mal betrachtet
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

Beitrag von Uwe82 »

Mir ist nochwas aufgefallen: Wenn ich mit angeschalteter Beleuchtung eine Fläche aus unterschiedlichen Winkeln betrachte, ändert sich deren Farbe. So als würde sie reflektieren.
Dateianhänge
dunkel
dunkel
windows_light_on_angle1.png (9.03 KiB) 7953 mal betrachtet
hell
hell
windows_light_on_angle2.png (9.9 KiB) 7953 mal betrachtet
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Uwe82 hat geschrieben: Habe jetzt unter Windows die Beleuchtung deaktiviert. Das Ergebnis ist auf jeden Fall schonmal bunt. Der Hintergrund sollte eigentlich weiß sein. Der Depth Buffer scheint unabhängig kaputt zu sein.
Dann sind es evt. bereits drei Probleme... ziemlich sicher keine Qt-spezifischen sondern eher OpenGL. Aber Schritt um Schritt: bewirkt "SetBackgroundColor" ein "glClearColor(1.0,1.0,1.0,1.0)"?
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

Beitrag von Uwe82 »

Ja, glClearColor(1.0,1.0,1.0,1.0) wird bewirkt.
Habe auch glClearColor(1.0,1.0,1.0,0.0) probiert - das Ergebnis ist ähnlich.

Mit dem 4. Wert auf 1.0 ist der Winkel, von dem die Objekte heller werden anders, als beim 4. Wert 0.0.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Uwe82 hat geschrieben:Ja, glClearColor(1.0,1.0,1.0,1.0) wird bewirkt.
...
Du bekommst also bei sowas einen schwarzen Hintergrund?

Code: Alles auswählen

void ...::initializeGL()
{
    glClearColor(1,1,1,1); 
    return;
   
    ... restlicher Kram
}

void ...::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    return;
    ...
}
arj
Beiträge: 45
Registriert: 1. Juni 2009 13:51
Wohnort: Ihringen

Beitrag von arj »

Versuch mal noch den Tiefentest zu setzen:

Code: Alles auswählen

glDepthFunc(GL_LESS);  // oder je nachdem was Du hier brauchst
Eventuell wird das ja auf den beiden Plattformen unterschiedlich initialisiert?!
(Ich glaube es zwar nicht, aber ein Versuch ist es eventuell Wert)
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

Beitrag von Uwe82 »

Hallo,

danke für eure Tipps. Die erste Lösung ist, die initializeGL Funktion zu überschreiben. Bisher gab es nur InitOpenGL, welche eine eigene Funktion ist.

Name war falsch.

Texturen werden immer noch nicht angezeigt.
Dateianhänge
windows, z-buffer ok, keine texturen
windows, z-buffer ok, keine texturen
windows_z_buffer_works_no_textures.png (24.97 KiB) 7895 mal betrachtet
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

Probleme gelöst

Beitrag von Uwe82 »

Das Texturproblem wurde gelöst durch den Aufruf von "makeCurrent" in der Funktion, in der die Texturnamen erzeugt wurden (außerhalb von paintGL).
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Kannst du nochmal den funktionierende Code zeigen? Eben all das was mit opengl zu tun hat. Aber hauptsaechlich die init Sachen. Danke.
Uwe82
Beiträge: 8
Registriert: 5. August 2010 17:52

Beitrag von Uwe82 »

Die Funktion initializeGL hieß vorher InitOpenGL und wurde extra anfangs aufgerufen. Unter Linux war das OK, unter Windows reichte das nicht.

initializeGL

Code: Alles auswählen

// make GLWidget to current GL environment
makeCurrent();

// set background color in QGLWidget (white)
qglClearColor(QColor(255,255,255));

// BEGIN OpenGL rendering settings
// -----------------------------------------------------------------------
// aktivate GL deepth settings
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

// set rendering priorities
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);

glEnable(GL_POINT_SMOOTH);

// set shading model
glShadeModel(GL_SMOOTH);

// set fill mode
glPolygonMode(GL_FRONT, GL_FILL);

// set material color
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);

// activate blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// enable automatic normal calculation
//glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);

// set GL clear color (obsoelte)
glClearColor(1.1f,1.1f,1.1f,0.0f);

//Enable textures for point clouds and camviews
glEnable(GL_TEXTURE_2D);

// set material attributes
//GLfloat pShininess[] = { 100.0f };
//glMaterialfv(GL_FRONT, GL_SHININESS, pShininess);

// END OpenGL rendering settings
// -----------------------------------------------------------------------


// set OpenGL init flag to true
m_bOpenGLInit = true;

// setup matrix for perspective view
SetupPerspective();
Antworten