QGLWIdget
QGLWIdget
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
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.jpg (109.06 KiB) 8002 mal betrachtet
-
- Windows, nur schwarz/weiß und Tiefenreihenfolge ignoriert
- windows.PNG (26.79 KiB) 8002 mal betrachtet
InitOpenGL
paintGL
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();
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
und paintGL
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_lights_off.png (13.32 KiB) 7955 mal betrachtet
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
- windows_light_on_angle1.png (9.03 KiB) 7953 mal betrachtet
-
- hell
- windows_light_on_angle2.png (9.9 KiB) 7953 mal betrachtet
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 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.
Du bekommst also bei sowas einen schwarzen Hintergrund?Uwe82 hat geschrieben:Ja, glClearColor(1.0,1.0,1.0,1.0) wird bewirkt.
...
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;
...
}
Versuch mal noch den Tiefentest zu setzen:
Eventuell wird das ja auf den beiden Plattformen unterschiedlich initialisiert?!
ch glaube es zwar nicht, aber ein Versuch ist es eventuell Wert)
Code: Alles auswählen
glDepthFunc(GL_LESS); // oder je nachdem was Du hier brauchstHallo,
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.
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_works_no_textures.png (24.97 KiB) 7895 mal betrachtet
Probleme gelöst
Das Texturproblem wurde gelöst durch den Aufruf von "makeCurrent" in der Funktion, in der die Texturnamen erzeugt wurden (außerhalb von paintGL).
Die Funktion initializeGL hieß vorher InitOpenGL und wurde extra anfangs aufgerufen. Unter Linux war das OK, unter Windows reichte das nicht.
initializeGL
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();