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. 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:
//Die Objekte aus einer Datei laden
OBJ_Model model;
model.init("test.obj");
//Alle Objekte rendern
model.render()
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?
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?
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:
glAlphaFunc(GL_GREATER, 0.01);
glenable(GL_ALPHA_TEST);
lg
_________________ Ich teile manchmal heimlich durch Null. - Alber Einstein
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:
glAlphaFunc(GL_GREATER, 0.01);
glenable(GL_ALPHA_TEST);
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 network • my 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
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.
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.