Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi open gl und 2d ? (https://www.delphipraxis.net/5929-open-gl-und-2d.html)

braingrenade 23. Jun 2003 16:08


open gl und 2d ?
 
Moin Leute !

Kann man mit opengl eigentlich auch nur 2d sachen machen ?
Ich hab schon nach tut's gesucht , aber die sind alle nur für 3d progging.

Weiß jemand ob's geht und wenn ja wie ich eine Tbitmap mithilfe von opengl darstellen kann (initialisieren von ogl kann ich schon)?

Chewie 23. Jun 2003 16:25

2D heißt ja, dass es zwei Ebenen gibt. Wenn die Koordinate für dei 3. Ebene immer den gleichen Wert hat, hast du im Prinzip 2 Dimensionen.

braingrenade 23. Jun 2003 16:46

Moin Chewie!

Das stimmt!

Aber weißt du wie ich ne Tbitmap ausgeben kann?

Mr_T 23. Jun 2003 19:02

Wie meinste das Mit der Tbitmap?
Hast du eine Bitmap als BMP auf der Festplatte oder haste eine Echtes delphi-Tbitmap?

Zum Theama 2d:
Ich würde an deiner Stelle aber nicht einfach nur auf die z-Koord verzichten, sondern ich würde das, was du normalerweise wenn du die Delphi VCl verwendest nach "Form1.FormResize" schreibst, durch dieses Ersetzen:

Delphi-Quellcode:
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluOrtho2D(0,width,0,height);
glMatrixMode(GL_MODELVIEW);
Damit bist du in dem Ortho-Modus, was bedeutet, dass du 1. wirklich auf die 3. koord verzichten kannst (man nehme dann glvertex2f() ) und, dass der Bildschirm etwas anders eingeteil ist....
was ich damit sagen will:
nun ist der Ursprung links oben (oder unten.. bin mir nicht so sicher) und die Opengl-Koord (1024,768) genau gegenüber (bei einer Auflösung von 1024x768....) das macht das Programmieren gleich einfacher und auch wenn man irgendwas mit Mausklickt auf ein Obejkt realisieren will, fällt einem das so viel leichter....

braingrenade 23. Jun 2003 19:11

Moin Mr_T !


1.Also ich mein das mit ner echten Delphi TBitmap !

2. Genau so hat ich mir's Vorgestellt!

Ich hab auch irgendwo gehört das man mit opengl ne ziemlich schnelle Transparenz machen kann , weißt du wie ?

Mr_T 23. Jun 2003 19:58

Also die Sache mit dem Tbitmap ist echt kompliziert.. geht es auch anders?
(Was genau ist überhaupt dein Ziel?)
Tranzparenz geht recht einfach... (aber ich habe es in 2d nich nicht getestet....)
Falls du dich bereits etwas mit Texturen und den ogl-Basiks auskennst, kannste in nem dem 6. Teil eminer Ogl-Tut-Serie etwas über transparenz nachlesen (dies ist die Indexsite zu den Kursteilen: http://www.dcw-group.net/index.php?m.../oglkurs/index )

Aber wie gesagt: ich würde auf das Tbitmap verzicheten... oder, wenn es unvermeidbar ist, dass ein Tbitmap da ist, würde ich den Inhalt kurz Temporär in eine Bmp saven und dann in Ogl laden...
wenn man versucht für Open Gl eine BMP-Textur zu laden und die Richtigen Units verwendet, dann hat braucht man nämlich nur 3 Zeilen Quelltext dazu ... ich will nicht wissen, wie das mit dem tbitmap aussieht..... :P

braingrenade 23. Jun 2003 20:08

Also eigentlich bin ich gerade dabei ne Kollisions-abfrage zu programmieren , ursprünglich wollt ich sie mit delphix machen , aber da geht's nich so wie ich es will und außerdem gibts da schon den Tsprite.
Und opengl ist ja auch schneller und etwas unkomplizierter(in mancher hinsicht jedenfalls).

Es würde auch schon reichen wenn ich die bmps von der Festplatte lade,
welche units brauche ich da ?

Auskennen tu ich zwar noch nicht so , aber für ein tut bin ich immer zu haben !

Mr_T 23. Jun 2003 20:34

Also ich persönlich würde dir zur glbmp-Lib raten (ich weiß, ich verwende in meine Tuts ne andere, bin aber zur erkenntniss gekommen, das die Glbmp besser ist...)
Runterladen kannst du dir die hier:
http://www.cfxweb.net/~delphigl/projects/glbmp.htm

Das laden einer Textur von der Platte ist sehr einfach... zunächst brauchste ne GLOBALE Variable, welche die textur aufnehmen soll:
Delphi-Quellcode:
var
  Form1: TForm1;
  textur1 : tglbmp;
Ne Textur laden kannste dann so:

Delphi-Quellcode:
procedure loadTextures;
begin

textur1 := tglbmp.Create;
textur1.LoadImage('Dateiname');
textur1.GenTexture;
Wie man ein Quadrat zeichnet, weißte ja sicher...
naja: Ich verwende hier die Textur mal Beispielsweise an einem solchen:
Delphi-Quellcode:
procedure render;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
glLoadIdentity;
textur1.bind();
glbegin(gl_quads);
gltexcoord2f(0,0);
glvertex2f(1,1);
gltexcoord2f(0,1);
glvertex2f(1,10);
gltexcoord2f(1,1);
glvertex2f(10,10);
gltexcoord2f(1,0);
glvertex2f(10,1);
SwapBuffers(form1.myDC);
end;
Ps: ich habe vergessen zu erwähnen, dass man logischerweise noch bei "uses" "blmp" eintragen muss und die Libary in sein projektverzeichniss kopieren sollte...
Man kann mit dieser Lib im übrigen auch andere Bildformate lesen... um etwas Platz zu sparen sind z.b. jpgs manchmal ganz praktisch ;-)

braingrenade 23. Jun 2003 20:57

OPTIMAL!
sieht mal echt einfach aus !

Nun die letzte Frage :

Weißt du wie so eine bmp mit einer transparenten Farbe versehen kann?
(so wie bei Tbitmap)

P.S.: Die tuts von dir sind echt gut !

braingrenade 23. Jun 2003 21:00

Man sollte immer besser alles durchlesen!!

grad kuck ich's mir an und seh das glbmp das ja kann !!

gut gut !

Mr_T 23. Jun 2003 21:09

Von einer bestimmten Farbe nur? Ist ja langweilig...
Die Glbmp-lib bietet dir die möglichkeit für jedes Pixel einzeld seinen Tranzparenz-Grad zu bestimmten...
dieses macht man mit "textur1.addalpha(dateiname)" Die Datei, die Hier geladen wird, ist ebenfalls ein Bitmap, welches soweit ich weiß nur Schwarz-weiß ist und den Grad der Transparenz angiebt (0-256) Ich habe damit zwar noch nicht gearbeitet, aber es sollte nicht alzu schwer sein...

PS: das neue Bitmap muss dieselben Dimensionen haben, wie das Original! insgesammt würde ich duir noch für Texturen empfehlen, nur Texturen mit einer Seitenlänge von 2^X Pixel (64x64, 64x128, 128x128, 256x256......) zu verwenden, da viele Grakas mit Seitenlängen, die keine zweier-potzenmzen sind, Probleme haben.....

braingrenade 24. Jun 2003 17:45

Subba !

DAnke für die hilfe und den Tip!

braingrenade 25. Jun 2003 19:55

Hab doch noch ein problem...

Irgendwie kommt bei mir keine textur auf das viereck :

Delphi-Quellcode:
procedure tmyogl.x;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
glLoadIdentity;
textur.bind();
glbegin(gl_quads);
gltexcoord2f(1,1);
glvertex2f(1,1);
gltexcoord2f(1,99);
glvertex2f(1,100);
gltexcoord2f(99,99);
glvertex2f(100,100);
gltexcoord2f(99,1);
glvertex2f(100,1);
SwapBuffers(DevCon);
end;
ich bin mir bei den texcoord nicht ganz sicher , aber irgendwas müsste doch trotzdem kommen!

Mr_T 25. Jun 2003 20:30

Also, da du gar nichts siehst, tippt ich mal darauf, dass deine Textur das falsche Format hat (welche Breite / Höhe hat sie?)
Des weiteren sind deine Tex-Coords wirklich nicht das gelbe vom Ei...
so, wie du es schreibst, würdest du die Textur in beide Richtungen 99 Mal wiederholen! (ok, 98 mal.....) ...
Bei den Tex-Coords musste beachten, dass die Werte zwischen Null und eins liegen, d.h.: wenn du die Textur nur einmal auf der ganzen Fläche haben willst, musste die Werte
(0,0)
(0,1)
(1,1)
(1,0)
nemen....
Nimmt man größere Werte als "1!, dann wird die Textur einfach entsprechend vielfach wiederhohlt.... aber man sollte immer bei "Null" anfangen....

Ich gleube, deshalb dürfte deine Textur nicht zu sehen sein........ :idea:

Ach ja, noch eine Frage: wieso benennste deine Procedure so komisch?

braingrenade 25. Jun 2003 20:42

Achso!

Ich hab gedacht das sich die koordinaten der textur gleich wie vertex koordinaten verhalten!


Aber leider funtzt's trotzdem nicht , ich seh nur ein weißes viereck.



so is mein code jetzt:
Delphi-Quellcode:

procedure tmyogl.x;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
textur.bind();
glbegin(gl_quads);
gltexcoord2f(0,0);
glvertex2f(100,100);
gltexcoord2f(0,1);
glvertex2f(100,400);
gltexcoord2f(1,1);
glvertex2f(400,400);
gltexcoord2f(1,0);
glvertex2f(400,100);
SwapBuffers(DevCon);
end;


... //bei initialisierung:
textur := tglbmp.Create;
textur.LoadImage('c:\x.bmp');
textur.GenTexture;
...

meine textur ist 64*64 256 farben und mit image editor gemacht.

Mr_T 25. Jun 2003 20:55

Aha, da liegt der Hase......
Ich habe das eben mal getestet: Die Glbmp-Lib mag keine BMPs,mit einer Farbtiefe von 256 Farben....... Das kommt davon, dass ich nur Truecolor-Pics verwende (aber als Jpg meistens....) Versuche mal daraus ein Truecolor-Bitmap zu machen... dürfte er besser vertragen....

braingrenade 25. Jun 2003 21:24

hmmm....
habs jetzt mit ner 24 bitigen bmp versucht , geht auch nicht.

Kannst du einen kurzen beispiel-code posten ?
Dann vergleich ich mal mit meinem .

Mr_T 25. Jun 2003 21:44

Liste der Anhänge anzeigen (Anzahl: 1)
Ok, ich habe hier einfach mal ein einfaches Beispeil geschrieben....
(Eine Frage am Rande: wo bei deinem Code ist dein "glend;" geblieben?)

braingrenade 25. Jun 2003 22:13

JEEEEEHHHHHHAAAAAAAAAA!!

hatte nur was in dem befehl falsch :

glenable(gl_texture_2d);


alles funzt !!!

DAnke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz