| Autor |
Beitrag |
loetmann
      
Beiträge: 29
Delphi 3
|
Verfasst: Mi 16.11.05 13:53
Hallo,
ich habe in OpenGl folgende Routine geschrieben (Aufruf aus Renderroutine):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| glColor4f(1.0,1.0,1.0,1); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH);
glBlendFunc(GL_DST_COLOR,GL_ZERO); glBindTexture(GL_TEXTURE_2D, texturIDarray[texturInfo[texnum].alphaid]); glbegin(gl_quads); gltexcoord2f(0,0); glvertex3f(koord.p1.x,koord.p1.y ,koord.p1.z); gltexcoord2f(0,1); glvertex3f(koord.p2.x,koord.p2.y ,koord.p2.z); gltexcoord2f(1,1); glvertex3f(koord.p3.x,koord.p3.y ,koord.p3.z); gltexcoord2f(1,0); glvertex3f(koord.p4.x,koord.p4.y ,koord.p4.z); glend; glBlendFunc(GL_ONE, GL_ONE); glBindTexture(GL_TEXTURE_2D, texturIDarray[texturInfo[texnum].textid]); glbegin(gl_quads); gltexcoord2f(0,0); glvertex3f(koord.p1.x,koord.p1.y ,koord.p1.z); gltexcoord2f(0,1); glvertex3f(koord.p2.x,koord.p2.y ,koord.p2.z); gltexcoord2f(1,1); glvertex3f(koord.p3.x,koord.p3.y ,koord.p3.z); gltexcoord2f(1,0); glvertex3f(koord.p4.x,koord.p4.y ,koord.p4.z); glend;
glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glBlendFunc(GL_ONE, GL_ONE); |
Dabei passiert folgendes:
Als erstes setze ich die Objektfarbwe auf weiß, dann wird die Alphamap gezeichnet (Anhang mitte), dann die Colormap (Anhang links) und das Resultat ist im Anhang rechts zu sehen (Gelb=Hintergrund/andere Objekte).
Das dumme an diese Geschichte ist das ich in der Colormap durchsichtige Bereiche auch Schwarz setzen muß (beim Cursor nicht so schlimm). Ich möchte aber z.B. aus einer farbigen Fläche mit hilfe der Alphamap was Ausstanzen (so wie das in div. 3D-Programmen geht).
Ich habe zwar schon einige Tutorials (nagut es war das selbe aber in zig Sprachen auf zig Seiten...) gelesen das so aber nicht hinbekommen.
Es währe schön wenn mir jemand einen Tipp geben könnte, so das ich in der Colormap nicht mehr die tranzparente Flächen schwarz malen muß. Interessant sind also die roten Bereiche und die Reinfolge.
Ein Gruß
Loetmann
Moderiert von raziel: Quote- durch Delphi-Tags ersetzt
Einloggen, um Attachments anzusehen!
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 16.11.05 14:29
Also so wie du das gerade machst, vergisst du das am besten gleich mal wieder. Oder noch besser markier es als sehr sehr umständlich.
Das was du haben willst ist sehr einfach. Du musst lediglich deine beiden Texturen in einem Grafikprogram vereinen. Die Textur musst du dann als TGA oder PNG speichern. Je nachdem was dein TexturenLoader für Formate unterstützt. Mit dem passenden Loader könntest du die beiden Bilden auch in eine Texture zusammenfügen. Der Trick dabei ist, dass die Textur dann neben dem roten, grünen und blauen Kanal noch einen Alphakanal besitzt. Dieser wird dann direkt als Transparenz für deine Fläche benutzt. In verbindung mit der Transparenz der Farbe etc.
Soll bedeuten du machst ein Bild welches genau so aussieht wie das Linke aber welches noch einen Alpha Kanal beinhält was aussehen würde wie die invertierte Mitte. Invers deswegen, da Schwarz vollkommen transparent und Weiß vollkommen sichtbar ist. In einem Grafikprogramm (Gimp o. Photoshop) wäre das so etwas wie Ebenemaske. Wie das bei anderen heißt weiß ich nicht .
Für den Fall, dass du so etwas lieber mit dem Loader machen möchtest kann ich dir meinen Loader anbieten. Der kann neben TGAs auch PNGs laden. Und es gibt sogar ein Kapitel in welchem ich den Weg beschrieben habe wie man Mittels mittels Texturenloader einen Alphakanal hinzufügen kann.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
loetmann 
      
Beiträge: 29
Delphi 3
|
Verfasst: Mi 16.11.05 14:42
Die Idee mit PNG hatt ich auch schon (für bitmapbasirende Grafiken nutze ich das schon) aber soweit binn ich in OpenGL noch nicht. Ich gehe zum Verständis erstmal Schritt für Schritt vor. Um mir auch dynamische Texturen vorzubehalten.
Es gibt zwar diverse Bibliotheken (wiki.delphigl.com) aber die sind erst ab Delphi 4 und ich habe Delphi 3.
Ich werde mir aber Deinen Loader mal zu Gemüte führen.
Kann in der Bitmap-Strucktur das Alphabild direckt mitgeschriben werden? Die Datenstruktur von auxDIBImageLoadA ist ja sizeX,sizeY:integer,data:pointer, mit der 2^n-Einschränkung.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 16.11.05 15:31
Also ob mein Loader auch mir Delphi 3 läuft kann ich nicht sagen. Ich meine aber, dass die PNG Bibliothek da Probleme gemacht hätte. Das was du machen möchtest geht aber auch ohne Probleme mit TGAs. Und die Lade ich nativ.
Das andere Problem was du da aber haben wirst ist, dass mein Loader auch zwingend den DelphiGL OpenGL Header vorraussetzt. Aber ob dieser auch mit Delphi 3 läuft ist die nächste Frage.
Sonst kann ich dir aber nur raten die Finger von der Glaux zu lassen. Die ist richtig alt und nicht unbedingt die beste Art Texturen zu laden, da die Bildformate sehr einfach aufgebaut sind und keiner DLL benötigen.
Bitmap-Struktur: Hä? Also ein BMP (Datei) kann keinen Alphakanal enthalten. Das ist im Format nicht vorgesehen. Wenn du das geladen hast, dann kannst du durch Speichermanipulation einen Alphakanal hinzufügen. Und diesen kannst du dann problemlos an OpenGL übergeben. Das geht. Nichts anderes mache ich ja in meinem Loader.
Als "Alternative" würde ich dir sonst den Texturenloader von Sulaco ans Herz legen. Allerdings bietet der keiner nachträgliche Bearbeitungsmöglichkeiten und wie die Texturen geladen werden ist nicht immer fehlerfrei. Außerdem wurde der seit dem Erstellungszeitpunkt nicht mehr weiter entwickelt. Und die Zeit ist seither natürlich nicht stehen geblieben. Mit diesem Loader dürftest du Aufgrund der nicht vorhandenen Komplexibilität aber wohl besser fahren. Da der ja auch in etwa aus der Delphi 3 Zeit stammt.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
loetmann 
      
Beiträge: 29
Delphi 3
|
Verfasst: Mi 16.11.05 22:13
so ich hab mal die openGL1.5 geladen, die geht aber nicht unter Delphi3 obwohl es oben in der Beschreibung steht:
| Zitat: | { Works with : }
{ - Delphi 3 and up }
{ - FreePascal (1.9.3 and up) }
|
Das fängt mit Int64 an, geht über Funktionsdefinitionen die mit () difiniert sind (mag D3 nicht) und so weiter...
naja, ich werde noch weiter wiki.delphi studieren und probieren, bin ja ansich schon da wo ich hinwollte. Da fällt mir noch ein das es in der Firma nach ein paar OGLprogrammierer gibt, da kann ich ja mal in die Quellen gucken
Ich nutze für reines Bitmap (ohne OGL) eine pngimage-Unit die kann ich ja auch für 3D nutzen und mir eine Function zusammenfrickeln.
Ein Gruß
LM
|
|
loetmann 
      
Beiträge: 29
Delphi 3
|
Verfasst: Mo 21.11.05 23:59
Hallo,
so ich bin der Lösung einen Schritt näher gekommen.
naja, ich habe die textur.pas etwas auseinandergefrikelt so das ich tga laden kann.
und der Anzeigecode sieht so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| ON_GL_TEXTURE_2D(true); ON_GL_DEPTH_TEST(true); ON_GL_BLEND(true); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(1.0,1.0,1.0,alpha); glBindTexture(GL_TEXTURE_2D, texturIDarray[texturInfo[texnum].textid]); glbegin(gl_quads); gltexcoord2f(0,0); glvertex3f(koord.p1.x,koord.p1.y ,koord.p1.z); gltexcoord2f(0,1); glvertex3f(koord.p2.x,koord.p2.y ,koord.p2.z); gltexcoord2f(1,1); glvertex3f(koord.p3.x,koord.p3.y ,koord.p3.z); gltexcoord2f(1,0); glvertex3f(koord.p4.x,koord.p4.y ,koord.p4.z); glend; |
ON_GL_ sind Funktionen in denen ich die entsprechende ogl befehle setze, hat den Vorteil das sie nicht gedoppelt gesetzt werden.
Aufbau:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure ON_GL_DEPTH_TEST(switchon:boolean); begin if isGL_DEPTH_TEST and switchon then exit; if not isGL_DEPTH_TEST and not switchon then exit;
if switchon then glEnable(GL_DEPTH_TEST) else glDisable(GL_DEPTH_TEST); isGL_DEPTH_TEST:=switchon; end; |
in der textur.pas habe ich noch ein fehlendes CloseFile(TGAFile); hinzugefügt, da sonst benutzte Texturen offen bleiben.
Mein Kollege hat mit dazu noch folgenden Link gegeben:
www.zjprogramming.com/html/alphablend.html
ich werde mir bei Bedarf dann noch bmp, jpg und png vornehmen.
Ein Gruß
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 22.11.05 09:01
Ich will ja nicht unken. Aber deine ON_GL funktionen solltest du lassen. Ich bin der Meinung, dass es Aufgabe des Treibers ist so etwas zu optimieren. Also wenn irgendetwas bereits aktiviert ist, dass er es nicht noch einmal aktiviert. Und das wird er so oder abprüfen. Dabei spielt es keine Rolle ob du es schon geprügt hast. Und bei allem was du abprüfst gehe ich mal sehr stark davon aus, dass es eher sogar langsamer ist als wie wenn du es direkt setzen würdest. Liegt zwar generell nicht unbedingt im messbaren Bereich aber es macht ja nun mal auch einiges an Arbeit solche Methoden überhaupt zu schreiben etc. PS: Was ist wenn du an irgeneiner Stelle (oder eine externe Unit) etwas setzt was nicht über diese Methoden geht. Dann steht deine Variable noch auf einem anderen Wert und deine Aufrufe wandern ins leere obwohl sie es eigentlich nicht tun sollten und dürfen.
Gib deinem Kollegen mal folgende Links:
www.delphigl.com/launcher.php?em=tutorials
wiki.delphigl.com/index.php/Tutorial
Bei dem ersten Link ist unter Einsteiger ein Tutorial Namens "Verblendet". Solltest du dir mal anschauen. Ist geringfügiger komplexer als das Blending Sample.
Textures.pas: In meinen Augen hat die Textures so einige Macken. BMP werden unter bestimmten Umständen nicht korrekt geladen. Uvm. Leider erfreut sie sich dennoch größter Beliebtheit. PNG Support nachzurüsten mag zwar eine interessante Übung sein. Aber bitte den Vergleich nicht missverstehen. Das wäre so als würde man einen Porschemotor in einen Trabi einbauen wollen. Ich weiß, dass ich mich mit solchen Sprüchen, bei dem ein oder anderen, nicht beliebter mache. Aber das ist ganz ehrlich meine Meinung. Es hat schließlich auch einen Grund warum ich seit über 2 Jahren einen eigenen Loader entwickel.  Und es wohl gemerkt immernoch tue und auch in nacher zukunft noch tun werde.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
loetmann 
      
Beiträge: 29
Delphi 3
|
Verfasst: Di 22.11.05 19:12
moin moin,
Nein, beim "überprüfen" nutze ich eigene Variabeln, da ich dynamisch verschiedene Objekte lade wird nur dann umgeschaltet (ein oder aus) wenn es wirklich nötig ist. Bisher habe ich 10 Frames damit rausgeholt. Und ich habe alle Funktionen so geschrieben das Sie über diese Funktionen gehen. Es ist auch alles gekapselt so das das Ganze nicht zu unüberischtlich wird (z.B. eine Funktion zum zeichnen eines Quads, Tris etc., die wiederum von einer Funktion zum zeichen einen komplexen Objekts aufgerufen werden).
ja, die Links kenne ich schon. Meinem Kollegen werden sie nichts bringen da er directX und Java/C programmiert. Seine Programme sind auch schon des längeren im Einsatz.
Ja, Deine/Eure Loader und Header sind ja schön und gut, aber laufen nicht ohne weiteres unter Delphi 3. Und schließlich will ich ja noch was lernen. Es ist ja auch befriedigender wenn ich selbst was zum laufen gebracht habe.
Ein Gruß & frohes coden
LM
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 22.11.05 19:44
| Zitat: | | Nein, beim "überprüfen" nutze ich eigene Variabeln, da ich dynamisch verschiedene Objekte lade wird nur dann umgeschaltet (ein oder aus) wenn es wirklich nötig ist. Bisher habe ich 10 Frames damit rausgeholt. Und ich habe alle Funktionen so geschrieben das Sie über diese Funktionen gehen. Es ist auch alles gekapselt so das das Ganze nicht zu unüberischtlich wird (z.B. eine Funktion zum zeichnen eines Quads, Tris etc., die wiederum von einer Funktion zum zeichen einen komplexen Objekts aufgerufen werden). |
Na wenn das so ist habe ich nichts gesagt.
| Zitat: | | Ja, Deine/Eure Loader und Header sind ja schön und gut, aber laufen nicht ohne weiteres unter Delphi 3. Und schließlich will ich ja noch was lernen. Es ist ja auch befriedigender wenn ich selbst was zum laufen gebracht habe. |
Ging mir gerade nicht darum meinen Loader anzupreisen (nicht primär  ) sondern eher um die Missstande in der Textures. Ich hätte natürlich auch einfach so auf das (Textures oder glBMP (basiert auf Textures) ) aufsetzen können aber ich habe den von Grund auf neu geschrieben. Das meinte ich damit.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
|