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

Aktuelle Zeit: Di Mai 14, 2024 12:13

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Transparenz im eigenen Modelloader
BeitragVerfasst: So Mär 11, 2012 21:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Hey DGLer!

Ich habe es nun endlich geschafft einen eigenen Loader für das OBJ-Format zu schreiben, aber am Punkt Transparenz hängt es bei mir wieder...

Zur Funktion (damit ihr eine Vorstellung davon habt):
Mein Ziel war es einen ganz simplen Modelloader für statische Objekte zu schreiben, weitestgehend Objektorientiert zu arbeiten und auf Vertex-Arrays zu setzen.
Die drei Sachen hab ich hinbekommen. :mrgreen:
Ich lade die OBJ und MTL Dateien. Die Materials kommen in einen Vector. Dieser ist mit structs befüllt, welche jeweils den Namen, die Farbinformationen einschließlich Alpha und eine Textur enthalten.
Jetzt hab ich alle Geometrie und Materialinformationen lose im Speicher und packe sie in eine kleine Klasse. Diese Klasse enthält dann die Vertex, UV und Normal Arrays, sowie die Textur und die Farbinformationen.

Im Code kann ich es so nutzen:
Code:
  1.  
  2. //Die Objekte aus einer Datei laden
  3. OBJ_Model model;
  4. model.init("test.obj");
  5.  
  6. //Alle Objekte rendern
  7. model.render()
  8.  


Mein Loader unterstützt derzeit nur eine Textur und ein Material pro Objekt (ich modeliere und exprotiere mit Blender).

Das Problem:
Beim Blending muss die Zeichenreihenfolge von fern zu nah sein. Jetzt müsste ich jedes Objekt auf Transparenz prüfen, schauen wie weit weg die anderen Objekte der Szene sind, alles neu ordnen und dann zeichnen.
Kann man das nicht mit weniger Aufwand lösen?
Und was sollte die Transparenzinformationen liefern? Die Textur oder das Material? In meiner Vorstellung kommt das wieder auf die Situation an. Glasscheiben z.B. mit dem Material und Bäume, welche wie bei Collin McRae aus zwei Quads bestehen, mit teilweise transparenten Texturen.
Beides zu nutzen würde noch mehr Sortierarbeit hervorrufen. :(
Wie gehe ich da am besten vor?

Hat Jemand einen Vorschlag?
Dankeschön.

LG Chapter.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 11, 2012 23:09 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Zitat:
Jetzt müsste ich jedes Objekt auf Transparenz prüfen, schauen wie weit weg die anderen Objekte der Szene sind, alles neu ordnen und dann zeichnen.
Kann man das nicht mit weniger Aufwand lösen?
Es gibt in den Tutorials ein Verfahren mit mehreren Renderduchläufen. In irgendeinem Post vom mir habe ich dazu auch mal einen veränderten Quelltext eingestellt. http://www.delphigl.com/forum/viewtopic.php?p=80750#p80750
Eine andere Möglichkeit ist das ganze mit Shadern zu machen, dies Dual Depth Peeling. http://www.delphigl.com/forum/viewtopic.php?f=20&t=9780


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 12, 2012 06:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Chapter hat geschrieben:
Hey DGLer!
Das Problem:
Beim Blending muss die Zeichenreihenfolge von fern zu nah sein. Jetzt müsste ich jedes Objekt auf Transparenz prüfen, schauen wie weit weg die anderen Objekte der Szene sind, alles neu ordnen und dann zeichnen.


OpenGL hat dafür einen Code der das Problem von selbst lösen sollte. Schreib ihn am besten bei der OpenGL-initialisierung irgendwo ans Ende dazu.
Code:
  1.  
  2. glAlphaFunc(GL_GREATER, 0.01);
  3. glenable(GL_ALPHA_TEST);
  4.  


lg

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 12, 2012 10:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ida hat geschrieben:
OpenGL hat dafür einen Code der das Problem von selbst lösen sollte. Schreib ihn am besten bei der OpenGL-initialisierung irgendwo ans Ende dazu.
Code:
  1.  
  2. glAlphaFunc(GL_GREATER, 0.01);
  3. glenable(GL_ALPHA_TEST);
  4.  

Da hast du aber die Nebenwirkungen verschwiegen. Das ist (a) binär und (b) funktioniert Multisampling an diesen Kanten nicht. Hier wird einfach alles, was an einem Objekt ein Alpha kleiner als 0.01 hat, weggelassen. Das funktioniert per Pixel, ist recht effizient und braucht keine Sortierung. Ist aber definitiv auch keine echte Transparenz.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 12, 2012 16:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Also den Alphatest, den Ida vorgeschlagen hat, kenne ich und habe ihn auch schon genutzt. Wenn mich nicht Alles täuscht wurde das ja bei Bäumen und Büschen so gemacht. Die Technik ist mir aber unsympatisch, weil es nur sichtbar oder unstchtbar gibt, wie Lord Horazont schon sagte.

Der Ansatz von Jens01 ohne Shader gefällt mir. Das funktioniert aber nur mit den Alphawerten der Materials. Oder sehe ich das falsch? Dann würden die Alphakanäle der Texturen wieder in der Luft hängen.

Hat es überhaupt Sinn die Alphainformationen aus Material und Textur zu bearbeiten, oder sollte ich mich lieber auf eines konzentrieren? Wie gesagt, es ist mein erster Anlauf. Ich habe keine Ahnung was wichtig ist.

LG Chapter.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.030s | 17 Queries | GZIP : On ]