Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Apr 28, 2024 19:24

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: So Jan 19, 2014 18:16 
Offline
DGL Member

Registriert: Sa Dez 28, 2013 18:42
Beiträge: 7
Programmiersprache: c++, c
Hallo meine Freunde...

folgendes liegt vor: Ansicht eines Kopfes, einmal der Haut und einmal des Schädels.
Der Schädel soll nicht transparent und durch die Haut sichtbar sein. Ist er auch aber halt transparent.
Mit Reihenfolgen habe ich schon rumprobiert und die SuFu habe ich auch genutzt. Jedoch war das wenig hilfreich.

Hier der Teil meines Codes wo alles aufgerufen wird:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_DEPTH_TEST);
glColor4f(1.0, 1.0, 0.0,1.0);
glCallList(SzeneIDKnochen);

glDepthMask(GL_FALSE);
glEnable(GL_BLEND);

glColor4f(1.0, 0.0, 1.0,0.1);
glCallList(SzeneIDHaut);
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);


Vielen Dank schon mal ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 18:28 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Für den Schädel kannst du Blending abschalten.
Ansonsten wäre eine Erklärung gut, was jetzt genau nicht funktioniert. Vlt mit Bild vom aktuellen und vom gewünschten Zustand.

Des Weiteren solltest du dir bewusst sein, das deine Grafikkarte erstmal die Dreiecke nicht nach Tiefe sortiert.
Das heißt, wenn sich zwei Dreiecke in ihrer Farbe unterscheiden und du erst eine Dreieck vorne und dann ein Dreieck dahinter renderst, erhältst du ein anderes Ergebnis, als wenn erst das Dreieck hinten und dann das Vorne gerendert wird. (Alphablending ist nicht Kommutativ oder Assoziativ)

Wenn das dein Problem sein sollte, dafür gibt es zur Zeit nicht wirklich eine Lösung. Im Prinzip bleiben zum Lösen das Problemes kaum Möglichkeiten. Entweder du sortierst die Dreiecke auf der CPU(Langsam) oder du setzt eine neuere komplexe Renderingtechnik ein.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 18:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Mit dem Problem habe ich auch schon gekämpft. Am besten bewährt hat sich, zuerst die deckenden Fragment zu zeichnen und anschliessend dir Transparenten.

Zitat:
oder du setzt eine neuere komplexe Renderingtechnik ein.

Willst du damit sagen, das es mit OpenGL 3.3 besser Möglichkeiten gibt ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 18:50 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Kommt darauf an, wie du vorgehst.
Theoretisch kann man Dreiecke mit Geometryshader und Transformfeedback sortieren, oder man könnte andere GPU Lösungen wie OpenCL einsetzen. Außerdem besteht eine Möglichkeit, eine Liste der Fragmente im Fragmentshader zusammenzubauen und diese dann dann erst anschließend sortiert endgültig zu rendern. Das braucht aber spezielle Extensions und viel Speicher für die halbwegs effiziente Umsetzung.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Also wenn man näherungsweise annimmt, dass die Haut eines Kopfes eine Kugel ist (bzw. was kugelähnliches), geht die Sortierung auch einfacher: Erst die Backfaces rendern und danach die Frontfaces.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 18:56 
Offline
DGL Member

Registriert: Sa Dez 28, 2013 18:42
Beiträge: 7
Programmiersprache: c++, c
Okay, verstehe...

Wie komplex das ist was ich da von meinem Rechner verlange ist, weiß ich nicht. Ich hoffe mal nicht :)

Ich hab den Blendingaufruf verschoben, mein Code sieht nun so aus:

glEnable(GL_DEPTH_TEST);
glColor4f(1.0, 1.0, 0.0,1.0);
glCallList(SzeneIDKnochen);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(GL_FALSE);
glEnable(GL_BLEND);

glColor4f(1.0, 0.0, 1.0,0.1);
glCallList(SzeneIDHaut);
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);


Das Ergebnis ist noch immer das gleiche... :/



Ich kann mit Hilfe der Mauszeiger zwischen den Ansichten switchen, 1. und 2. sehn aus wie sie aussehn sollen. Die 3. ist halt Falsch. Der Schädel ist durch die Haut sichtbar. Aber halt Transparent. Er soll keinerlei Transparenz haben.


Im Anhang sind Pics beigefügt. Das Bild mir der Kugel und dem Cube zeigt wie es aussehen soll. Durch die Kugel hindurch erkennt man den Cube.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Ich weiß nicht, was deine 1., 2. und 3. Ansicht sind, aber Objekte ohne aktiviertes Blending transparent zu zeichnen ist eigentlich unmöglich. Bist du sicher, dass du nicht irgendwo ein
Code:
  1. glEnable(GL_BLEND);
übersehen hast? In dem von dir geposteten Code-Schnippsel ist es ja auch doppelt. Beachte, dass das Blending am Ende eines Frames nicht automatisch wieder deaktiviert wird.

Edit: Danke Jens, das Paper zu DDP sieht sehr interessant aus. Hab's mir mal auf die ToDo-Liste gesetzt.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Zuletzt geändert von glAwesome am So Jan 19, 2014 19:15, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:07 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Das DDP ist auch noch eine Möglichkeit für Transparenz.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:09 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
@glAwesome
Vom bestimmten Sichtpositionen aus würde es aber weiterhin Probleme geben.
Ein Schädel oder das Gesicht ist nicht konvex.



Das Bild kann eigentlich nicht zustande kommen, wenn du erst den Schädel normal renderst.
In dem Code änderst du einmal den Blendenable-State vollkommen sinnlos.

Das Bild sieht für mich so aus, als ob der Schädel gar nicht gezeichnet werden würde und nur durch den Tiefentest der Haut an der Stelle, die Umrisse zu erkennen sind. Du solltest nochmal den Tiefentest überprüfen. (Und ob die Tiefenwerte auch bei "glclear" geleert werden.) Zum Testen kannst du den Tiefentest auch mal deaktiveren.
Ansonsten:
Bist du wirklich sicher, dass in der Reihenfolge gezeichnet wird, wie im Code?
Was ist genau der Unterschied zwischen den einzelnen Ansichten?
Sind die Blendingeinstellungen am Anfang wirklich richtig? Es kann auch an der Farbe, dem Fragmentshader oder anderen Einstellungen liegen...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:13 
Offline
DGL Member

Registriert: Sa Dez 28, 2013 18:42
Beiträge: 7
Programmiersprache: c++, c
habs nach gl_enable(gl_blend); abgesucht. kein weiteres mal im code enthalten.

ps: ich hab 2 fotos hochgeladen ich weiß nicht ob das andere untergegangen ist da es nicht angezeigt wird...da sieht man was ich mit 1. , 2. und 3. ansicht meine.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:14 
Offline
DGL Member

Registriert: Sa Dez 28, 2013 18:42
Beiträge: 7
Programmiersprache: c++, c
glAwesome hat geschrieben:
Also wenn man näherungsweise annimmt, dass die Haut eines Kopfes eine Kugel ist (bzw. was kugelähnliches), geht die Sortierung auch einfacher: Erst die Backfaces rendern und danach die Frontfaces.



meinst du mit face culling?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:15 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zum Testen des Blendingzustandes kannst du die Werte auch am Anfang der Funktion mit "glGetIntegerv" abfragen.
Ja, er meinte das vemutlich über Faceculling. Das Problem in den Bildern ist das aber eindeutig nicht dieses Problem.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Ja, genau. Mit Backface Culling.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:19 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
"Backface Culling" reicht nicht.
Du meintest doch, erstmal mit Frontfaces Culling und nur die Rückseite zu zeichnen und dann mit Backface Culling nur die Vorderseite.
Allerdings ist das, wie gesagt, ein anderes Problem.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 19, 2014 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Ja, stimmt. Es werden je nach Pass auch Frontfaces gecullt. Sinn dieser Begriffswahl war eigentlich, aufs Wiki zu verlinken.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 17 Queries | GZIP : On ]