Seite 1 von 1

QGLWIdget

Verfasst: 6. August 2010 11:54
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

Verfasst: 6. August 2010 12:02
von kater
Wo ist der Code?

Verfasst: 6. August 2010 12:18
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();

Verfasst: 6. August 2010 13:39
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?

Verfasst: 7. August 2010 00:46
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();


Verfasst: 7. August 2010 00:53
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.

Verfasst: 7. August 2010 09:58
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)"?

Verfasst: 8. August 2010 03:45
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.

Verfasst: 8. August 2010 12:44
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;
    ...
}

Verfasst: 9. August 2010 15:56
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)

Verfasst: 13. August 2010 15:06
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.

Probleme gelöst

Verfasst: 16. August 2010 20:26
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).

Verfasst: 16. August 2010 20:31
von kater
Kannst du nochmal den funktionierende Code zeigen? Eben all das was mit opengl zu tun hat. Aber hauptsaechlich die init Sachen. Danke.

Verfasst: 31. August 2010 08:29
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();