Fragmentierung beim Rendern

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Tenope
Beiträge: 4
Registriert: 23.06.2013, 20:38

Fragmentierung beim Rendern

Beitrag von Tenope »

Moin zusammen,

Ich baue mir gerade eine eigene kleine Grafik Engine um Geometrische Simulation für ein Studentenprojekt zu ermöglichen.
(Eigenentwicklung da ich sehr hohe Abtastraten auf die 3D Szenerie habe und es nicht in Echtzeit gerendert werden muss)

Dabei lese ich beliebige 3D Szenen aus Collada Dateien ein führe darauf meine Animationen durch. Alles ist dabei mit C++ mit Qt und OpenGl entwickelt. Wenn ich mir nun allerdings meine Szene mittels OpenGl rendern lasse habe ich komische Schattierung auf Teilflächen eines Objektes. (Alle Flächen werden als Dreiecke verarbeitet)

So sieht z.B. meine Szene in Blender aus:
Bild

und so die Szene von mir eingelesen und gerendert:
Bild

Meine erste Idee war des an den Normalen meiner Flächen liegt, aber diese habe ich mehrfach gegengeprüft und gegengerechnet und sie stimmen!

Meine jetzige Vermutung liegt an der Art meiner Beleuchtung. Hier mal ein Auszug wie ich das Licht in OpenGL initialisiere:

Code: Alles auswählen

        glEnable(GL_LIGHTING);
	glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
	glEnable(GL_COLOR_MATERIAL);

	// set up light colors (ambient, diffuse, specular)
	GLfloat lightKa[] = {1, 1, 1, 1.0f};  // ambient light
	GLfloat lightKd[] = {.7f, .7f, .7f, 1.0f};  // diffuse light
	GLfloat lightKs[] = {1, 1, 1, 1};           // specular light
	glLightfv(GL_LIGHT0, GL_AMBIENT, lightKa);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, lightKd);
	glLightfv(GL_LIGHT0, GL_SPECULAR, lightKs);

	// position the light
	float lightPos[4] = {0, 0, 0, 1}; // positional light
	glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

	glEnable(GL_LIGHT0); 
Hat jemand eine Idee woher dieser Effekt kommt ?


Danke im Voraus!


Edit: Wiederrufe die Aussage das die Normalen Stimmen ;-)
Zuletzt geändert von Tenope am 23.06.2013, 23:12, insgesamt 1-mal geändert.
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Re: Fragmentierung beim Rendern

Beitrag von B.G.Michi »

Das sieht sehr nach falsch rum orientierten Dreiecken aus. Da Blender standardmäßig beide Seiten rendert und vor allem auch beide Seiten einzeln beleuchtet, muss du für manche Dreiecke entweder die Orientierung ändern oder auch beide Seiten rendern und beleuchten.
Tenope
Beiträge: 4
Registriert: 23.06.2013, 20:38

Re: Fragmentierung beim Rendern

Beitrag von Tenope »

Müsste ich dafür alle Dreiecke doppelt Rendern oder gibt es unter OpenGL eine elegante Mehtode um Flächen beidseitig zu beleuchten ?

Ich gerade mal ein Versuch gemacht und einfach mal Alle Normalen invertiert, nun sind alle zuvor dunkeln Stellen hell und umgekehrt. Spricht für deine Theorie ;-)
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: Fragmentierung beim Rendern

Beitrag von Raphael »

Du kannst Blender die Faces automatisch ausrichten lassen und einzelne manuell nachjustieren.

EditMode -> Toolbar in 3D-View (Shortcut 'T') -> Normals: Recalculate/Flip Direction (beide Aktion werden auf die selektierten Faces ausgeführt)

Damit Blender Back-Face-Culling betreibt einfach in 3D-View von Solid auf Textured Rendering in der Bottom/Top-Leiste umstellen.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Fragmentierung beim Rendern

Beitrag von dot »

Tenope hat geschrieben:Müsste ich dafür alle Dreiecke doppelt Rendern oder gibt es unter OpenGL eine elegante Mehtode um Flächen beidseitig zu beleuchten ?
Backface Culling ausschalten und entsprechenden Shader verwenden.

Die richtige Lösung wär aber, die Winding Order der Dreiecke zu fixen. Backface Culling gibt's nicht ohne Grund...
Tenope
Beiträge: 4
Registriert: 23.06.2013, 20:38

Re: Fragmentierung beim Rendern

Beitrag von Tenope »

Ok Backface Culling war eh deaktiviert, aber wäre naklar sinnvoll.

Ich denke aber das ich den Fehler gefunden haben, und zwar gehe ich beim Importieren der Collada Datei aus das es sich um Flächen-normalen handelt und habe mir bis lang einfach selber Normalen berechnet falls es mehrere gab. Aber Blender exportiert ja Vertex Normalen und diese habe ich nicht berücksichtigt.
Tenope
Beiträge: 4
Registriert: 23.06.2013, 20:38

Re: Fragmentierung beim Rendern

Beitrag von Tenope »

Ich habe nun der Normalen je Vertex gespeichert und siehe da es sieht schöner aus:

Bild

Allerdings erhöht dies meine Simulationszeit drastisch das ich mehr Vektoren zum Transformieren habe.
Antworten