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

Aktuelle Zeit: Fr Jul 18, 2025 12:27

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jan 08, 2009 11:23 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
Zum laden einer Datei bin ich 1 zu 1 Lossy Ex' Anleitung gefolgt, aber irgendwas tut da ned Oo
Wenn ich ne bmp lade, tut ers ohne probleme.
Wenn ich ne gif oder png lade kommt:

LoadFromStream - Couldn't load Stream. It's possible to be an unknow Streamtype.

Für mich wären gif oder png wegen ihren Transparenzmöglichkeiten interessant.. Bzw ich fänds umständlich extra n einzelnen alpha-channel nachladen zu müssen =/
Ich mein, es ist ein Projekt in Kinderschuhen. Ersteinmal kann ich mich damit begnügen 00/255/255 transparent ausgeben zu lassen. Aber warums nicht tut würde mich schon interessieren Oo

Wenn ich schon dabei bin..
Ich bin relativ neu auf dem Gebiet o,o
Wie genau läuft das ab?
Ich lade mein Programm. Bei CreateFile kann ich die Texturen laden. Oder immer nur eine?
Und dann bei SystemIdle-Dingens zeichne ich ja. Damit das ganze cpuschonend bleibt müssten alle Texturen schon drin sein und ich müsste nurnoch switchen, welche ich jeweils vergeben will? (ja, ich weiß, dass man texturen so selten wie möglich wechseln sollte und deshalb am besten erst alles mit einer Textur, dann alles mit der anderen rendert.)

Was mich auch etwas überrascht hat:
Tiefe.
Ich bastel ja an einem simplen 2D-Projekt, d.h. da ists kein großes Problem, aber bei 3D würds mich stark wundern.
Ich hab anfänglich naiv geglaubt, wenn ich etwas in den Vordergrund rücke, wird es auch im Vordergrund geladen.
Bei mir lud es aber im Endeffekt immer das Objekt, das ich als letztes drinstehen hab.
Bei 2D kein Ding, ich mach ne Map und mein Held mitsamt Monster etc kommn alle weiter unten im Quellcode und sind "über" der Map. Aber was ist, wenn man n komplexes 3D-Dungeon hat?

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 13:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

gif-Dateien kann die glBitmap glaube ich nicht laden - das Format ist auch nicht wirklich geeignet. TGA-Bilder können jedoch nativ geladen werden und haben auch Transparenz.
Wenn du allerdings png-Dateien laden möchtest musst du oben in der Unit

Code:
  1.  
  2. {$define GLB_PNGIMAGE}
  3. // oder
  4. {.$define GLB_LIB_PNG}
  5.  


aktivieren. Damit wird dann eine externe Unit eingebunden, die das Laden übernimmt.

Was meinst du mit CreateFile? Beim Laden des Programms initialisierst du ja OpenGL, danach kannst du sofort alle Texturen laden, die du benötigst. Jede bekommt eine eigene ID,
deswegen darfst du auch mehrere laden.
In deiner Render-Prozedur kannst du dann mit glBindTexture() die verschiedenen Texturen (mit der ID) aktivieren. DU kannst natürlich auch
gleich TglBitmap2D.Bind() benutzen.

Eigentlich sollte auch in 2D das, was den vordersten Z-Wert hat vorne erscheinen, genauso wie in 3D. Du hast wahrscheinlich eine falsche glDepthFunc. GL_LEQUAL sollte das sein, oder du hast glEnable(GL_DEPTH_TEST) vergessen.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 13:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
@zur glBitmap: soweit ich weiß, kann die glBitmap PNG, aber nicht GIF (aber Lossy wird sicher noch was dazu sagen).
Zitat:
Bei CreateFile kann ich die Texturen laden. Oder immer nur eine?

Wenn Du mit CreateFile das TForm.OnCreate meinst: ja, Du kannst dort Texturen laden und und am besten gleich alle, aber natürlich hintereinander. Also ich meine, die glBitmap lädt immer nur pro Auftrag EINE Textur.

Zitat:
Damit das ganze cpuschonend bleibt müssten alle Texturen schon drin sein und ich müsste nurnoch switchen, welche ich jeweils vergeben will?

Ja.

Zitat:
Bei mir lud es aber im Endeffekt immer das Objekt, das ich als letztes drinstehen hab.

Es gibt den Tiefentest:
Code:
  1.    glEnable(GL_DEPTH_TEST);    // Depth Testing
  2.    glDepthFunc(GL_LEQUAL);     // The Type Of Depth Test To Do

Wenn der nicht eingeschaltet ist, funktioniert das 3D nicht richtig.

Zitat:
Ich hab anfänglich naiv geglaubt, wenn ich etwas in den Vordergrund rücke, wird es auch im Vordergrund geladen.

Der naive Glaube ist in diesem Fall richtig. :Wink:

Ein 3DObjekt wird an der 3D-Position dargestellt, wo Du es hinstellst. Entweder direkt, indem Du entsprechende Punktkoordinaten vergibst, oder indirekt, indem du ein Objekt am Koordinatenursprung zeichnest (oder an irgendeiner anderen Stelle), und es dann mit glTranslate verschiebst. Achtung: wenn man es am Koordinatenursprung zeichnest, muss man sogar verschieben, sonst sieht man es gar nicht.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 13:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was die glBitmap (hauptsächlicher bestand des Threadtitels) angeht werde ich darauf anworten. ABER zu deinen beiden anderen Fragen bitte ich dich jeweils ein seperates Thema zu erstellen und dein originalpost zu editieren und die Frage entfernen. Also das Handling mit den Texturen bzw die Frage zu 3D. Und alle die etwas zu diesen beiden Fragen sagen möchten mögen doch bitte auf die seperaten Fragen warten. Seperate Fragen weil es sonst zu unübersichtlich wird. Und dann bleibt mir/uns nur noch die Schließung des Themas übrig. Hmmm ich war wohl ein wenig zu langsam. Trotz dessen sollte es so gemacht werden.

Welche Anleitung meinst du? Wenn das die im Wiki ist, dann ist die leider etwas veraltet. Die Unterstützung von PNGs musst du erst aktivieren. Dazu findest du ein Define im oberen Teil der Unit. Entweder GLB_PNGIMAGE oder GLB_LIB_PNG. Damit bindest entweder die unit pngimage ein (die von borland assimiliert wurde und es nicht mehr direkt zum download gibt. nur noch über umwege) oder die unit libpng die wiederrum aber eine dll benötigt. Die unit libpng findest du auf meiner Webseite. link unten. Bin gerade faul.

Was die unterstützung von GIFs angeht. Die darfst du selber einbauen. GIFs werden aktuell und auch in Zukunft nicht unterstützt. Denn GIFs sind keine klassischen Bilder für 3D Anwendungen. Selbst wenn diese nur 2D sind. Bei PNGs solltest du daher auch nicht versuchen diese als Palettenbilder zu erstellen und zu laden. Das wird auch nicht gehen. Denn die Grafikkarte kann nur RGB(A) Bilder. Bilder mit Farbpaletten werden von OpenGL gar nicht unterstützt.

Du solltest also von Anfang an Formate benutzen die RGB Kanäle und einen seperaten Alphakanal haben. Dann könntest du die Bilder aber auch als TGA oder DDS abspeichern und das so benutzen. Dann bräuchtest du auch keine externe bibliothek einbinden, da die glBitmap diese nativ lesen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 16:43 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
Dann belassen wir das Thema bitte bei der glBitmap.
Ich habe die Fragen eig bewusst nebenbei gestellt, weil sie mir irgendwie keinen eigenen Thread wert waren. Bin momentan auch recht faul, zumal mein DDS Converter grad alles tut außer dem, was ich verlange.
Aber auf jeden Fall danke. DDS ist mir ein Begriff, ab da kann ich weiter rumspielen, bis alles so aussieht, wie ich es haben möchte ^^

Die GIFs und PNGs sind damit auch geklärt.

Anleitung meinte ich eine aus einem anderen Thread. Ich hab nach PNG gesucht und mir ein Paar Threads gelesen. Damit wollte ich nur sagen, dass ich auch 100% weiß, dass mein Code um, die Textur zu laden stimmen muss, weil er von dir direkt kommt.

Wenn ihr meint, dass der Thread zu unorganisiert ets ist/wird, wegen der Fragestellung, meinen Segen zum closen habt ihr. Das wär mir atm lieber als das in 2 Threads aufzuteilen ^^""

Danke nochmal!

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 18:46 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Deine letzte Frage deutet auf einen fundamentalen Denkfehler hin. Wenn du mehrere Texturen lädst, dann must du dir die IDs aufheben und binden, wenn du sie brauchst. Sonst ist immer die letzte gebunden. Ich denke das ist doch dein Problem. Wie gesagt, ein eigener Thread würde hier durchaus sinn machen.

Gehen PNGs nun bei dir, oder hast du's aufgegeben?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 23:18 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
Für PNGs brauche ich dlls etc und DDS ist mir vertraut und wenn es schon ein professionelles, unkomprimiertes Texturenformat ist, warum nicht?
TexturenIDs.. ich habe das Prinzip an sich glaube ich verstanden. Ersteinmal ist ein Herumprobieren und da habe ich nicht viele Texturen, also kann ich sie in 1 Bild packen und jeweils das nötige Stück rausnehmen.
Später werd ich mich damit auseinandersetzen, die IDs zu bestimmen, die geladen werden müssen. DAmit ist für mich das Problem an sich erstmal nach hinten gestellt. Wichtig war nur die Reihenfolge, weil meine ersten Versuche da schon scheiterten (Texturen laden bei jedem Frame schränkt die Funktionalität ein.)

Bei den DDS knüpft die nächste Frage an. Die lädt der Loader auch nicht.
Es gibt ein Photoshop-Plugin von nvidia. Ich habe mir die exe runtergeladen, ausgeführt etc etc und Photoshop bietet es mir immernoch nicht als Format zum Speichern an. plöth. Hab mir xnview geholt und verschiedene Formate zu DDS konvertieren lassen. Da kommt die selbe Fehlermeldung, vom unbekannten Format. BEi DDS gibts zig arten zu speichern. Ist das Plugin auf 1-2 Arten beschränkt?
Ne bestimmte bpp-rate? Irgendwas?
Oder ist xnview irgendwo komisch?

Ich hatte damit schonmal Probleme, weil ich Bilder für ein Spiel ersetzen wollte. xnview hat keine Fragen gestellt bezüglich Format. Es lässt sich auch nicht verstellen. DDS ist da DDS. Und mein Format hatte wohl ne zu hohe bpp-rate. Ich weiß allerdings nicht mehr, wie ich das damals behoben habe. Letztendlich tat es nämlich ^^"

[ edit: ]
Okay, von hand in Photoshop eingefügt. Nun rumspielen, was er annimmt. An sich will ich DXT3 8bit, rgba mit explicit alpha. Wird sich nun zeigen ^^ Notfalls habe ich ja noch weitere Einstellungen zum Ausprobieren.

[ edit2: ]
Er schluckts problemlos. Damit dürfte das erstmal geklärt sein. Vielen Dank! ^^

_________________
blub.. ? oo''


Zuletzt geändert von ecth am Fr Jan 09, 2009 00:45, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 00:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nimm png. Das kann jedes vernünftige Programm richtig laden und speichern, und glBitmap auch. Die Formate die du hier aufzählst hab ich ehrlich gesagt noch nie gehört geschweige denn gebraucht. 8)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 09:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

naja, png ist nicht unbedingt die beste Wahl. Seit irgendeiner OpenGL-Version wird auch das Laden von DDS-Bildern (also das DirectX Texturformat sozusagen) unterstützt.
Das hat sehr große Vorteile beim Laden in den VRAM, weil die Daten komprimiert hochgeladen werden können. Außerdem ist es auch beim Rendern schneller,
weil weniger Speicherzugriffe benötigt werden, um die Texel-Werte auszulesen.

Wie viel das im Endeffekt bringt, weiß ich nicht. Ich kann mir aber nicht vorstellen, dass es spürbare Performanceschübe bringt (beim Rendern).

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 10:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das kann ich allerdings auch nur bestätigen. PNG ist ein klasse Format. ABER für 3D Anwendungen eher nur bedingt wirklich sinnvoll. Sie unterstützen viele Formate und auch seperaten Alphakanal. Man benötigt aber im Falle der glBitmap entweder diese eine Unit die von Delphi 2009 aufgesogen wurde oder aber eine DLL. Und zwingend eine DLL benutzen zu müssen, wenn man RGBA8 Dateien hat ist wohl nur bedingt praktisch. Zu mal PNGs auch beim Laden noch deutlich mehr Zeit benötigen als so etwas wie TGA und DDS.

DXT3 ist ein komprimiertes Texturformat. Das kann direkt so in DDS abgelegt werden und kann direkt an OpenGL übergeben werden. Und das sollte nur noch ein viertel des ursprüngliches Platzes benötigen. Wobei ich da wohl eher zu DXT1 oder DXT5 raten würde. Bei DXT5 hat der Alphakanal im vergleich zu DXT3 einen größeren Wertebereich. Und das bei gleicher Größe. Bzw DXT1 hat einen 1 Bit Alphakanal oder aber keinen Alphakanal und dafür etwas mehr Details im RGB. DXT1 ist glaube ich sogar noch einmal kleiner als DXT3/5.

DXT Formate in der glBitmap sind auch übrehaupt kein Problem. Sollte die OpenGL Implementation keine komprimierten Texturen unterstützen werden die Texturen in das entsprechene unkomprimierte Format umgewandelt. Aber komprimierte Texturen sind seit 10 Jahren etabliert. Also sollte der Fall nahezu nicht eintreten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 13:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ok. Asche auf mein Haupt. :(

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 13:53 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
DXT3 und 5 ergaben bisher in der Tat nicht viel Unterschied. Was mich wundert: Ich schaffs nie einen Halbtransparenten Übergang zu machen.
Die Datei ist mit einem Verlauf ursprünglich versehen. Und ich weiß nicht, ob es dann in Delphi scheitert oder beim Speichern als DDS.
Gibt es eine Einstellung der glAlphaFunc die Teiltransparenz zulässt?

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 14:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

versuche mal:

Code:
  1.  
  2. glEnable(GL_BLEND);
  3. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  4.  


Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 15:05 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
Nun stört er sich wieder am glDepthFunc(LEQUAL);.
Weil sobald sich mehrere solche Objekte begegnen das viele Alpha des oberen Objekts die anderen überdeckt und ich da nur Hintergrund seh, weil das Alpha ja weggeschnitten wird.
Wenn ich doch mit glAlphaFunc(GL_GREATER, 0.1); anfange, dann fallen die meisten groben Ecken weg, aber der Übergangsbereich (den ich ja haben wollte. Der Sinn der Teiltransparenz) lässt untere Objekte verschwinden. (die unteren Objekte sind in dem Fall ja ebenfalls so Teiltransparent.)

[ edit: ]
Wobei sich das nun leicht beheben ließ, indem ich die Teile wirklich einfach andersrum anordne im Qeuellcode noch. Das geht ^^
Was mich noch wundert: Delphi erkennt ja das Format etc, sehr schön. Aber was in Photoshop einen gleichmäßigen Rand hatte, der nach Außenhin schwächer wird ist in Delphi an manchen Stellen trotzdem franzig. Kann man das irgendwie.. ka, gibts bessere Konvertionsmöglichkeiten? Gimp mag ich persönlich nicht. Aber irgend ein anderes Plugin als nVidias Photoshoplugin oder xnview?

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 10, 2009 16:26 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das liegt am Alphatest.
Mit dem kannst du Fragmente unter einem bestimmten Schwellwert vom Zeichnen auschließen. Wenn du das Blending aber eh nutzt, dann kannst du den Alphatest sehr niedrig einstellen, so dass nur solche Fragmente ausgeschlossen werden, die das Auge eh nicht mehr sieht.
Blending ist für solche übergänge viel wichtiger als der Alphatest.

Außerdem beschleicht mich das gefühl, dass du verkehrt herum zeichnest. Du must die Szene von hinten nach vorne Zeichnen wenn du Blending anschaltest. Da auch ein durchsichtiges Fragment für den Tiefentest zählt, und sonst die dahinterliegenden Fragmente "verdeckt".

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.008s | 15 Queries | GZIP : On ]