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

Aktuelle Zeit: Do Mär 28, 2024 18:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Aug 02, 2016 21:00 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Hallo Wissende,

wie man ein Rectangle erstellt und mit Farben und Transparenzen ausstattet, ist mir klar, aber wie ich statt Farbe die Fläche mit einem externen Bild befülle, ist mir unklar.

So erstelle ich ein Rectangle:
Code:
  1.  
  2. procedure TForm1.Add2DRectangle(XPos, YPos, ZPos, iWidth, iHeight: Extended);
  3. begin
  4.   glBegin(GL_QUADS);
  5.     glColor4f(1.0, 1.0, 1.0, 1); glVertex3f(XPos, YPos, ZPos);
  6.     glColor4f(1.0, 1.0, 1.0, 1); glVertex3f(XPos + iWidth, YPos, ZPos);
  7.     glColor4f(1.0, 1.0, 1.0, 0.5); glVertex3f(XPos + iWidth, YPos + iHeight, ZPos);
  8.     glColor4f(1.0, 1.0, 1.0, 0.5); glVertex3f(XPos, YPos + iHeight, ZPos);
  9.   glEnd;
  10. end;


Ein Png-Bild kann man ja so laden:
Code:
  1.  
  2.   png := TPNGObject.Create;
  3.   png.LoadFromFile('c:\temp\colorbar_alpha.png');
  4.  


Kann mir jemand einen Tipp geben, wie ich den png-Inhalt auf das Rectangle bringe?
Beispiel.png mit Alpha hängt an.

Vielen Dank
Lg Tom


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 05:21 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Siehe Tutorial 4:

https://wiki.delphigl.com/index.php/Tutorial_Lektion_4

Du musst dein Bild erst laden (TPNGObject koennte funktionieren, weiss ich nicht) und dann OpenGL uebergeben / auf die Grafikkarte uploaden mittels z.B. des glTexImage2D Befehls. Du brauchst in deiner Bildklasse (TPNGObject) irgendwo Zugriff auf die Binaerdaten des Bildes und musst ihr Format (z.B. RGB oder RGBa) wissen.

Dann kannst du die Textur hochladen und verwenden, indem du anstelle glColor4f die Texturkoordinaten uebergibts (also welcher Teil des Bildes an welchem Vertex angebracht werden soll). Fuer ein einfaches Rechteck sollte fuer den Anfang einfach 0,0 bis 1,1 reichen. Vorher musst du natuerlich noch die Textur binden (glBind oder so, siehe Tutorial).

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 08:28 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Hallo,

vielen Dank für den Hinweis und den Link!

Ich habe mir die beiden Dateien libPNG.pas und glBitmap.pas heruntergeladen.
Leider gibts in dem Tutorial keinen vollständigen Code, der die komplette Abfolge zeigt.
Ich habs mal damit versucht.

Code:
  1.  
  2. procedure TForm1.Add2DImage(XPos, YPos, ZPos, iWidth, iHeight: Extended; sImagePath : String);
  3. var
  4.   fTexture: TglBitmap2D; // Instanz unserer Textur
  5. begin
  6.   if FileExists(sImagePath) then
  7.     begin
  8.       fTexture := TglBitmap2D.Create; // Instanz der Klasse erstellen
  9.       fTexture.LoadFromFile(sImagePath); // Datei laden
  10.       fTexture.GenTexture; // geladene Textur an OpenGL übergeben
  11.       fTexture.Bind; // Textur und entsprechendes Target wird aktiviert.
  12.  
  13.       glBegin(GL_QUADS);
  14.         glTexCoord2f(0,0); glVertex3f(XPos, YPos, ZPos);
  15.         glTexCoord2f(0,1); glVertex3f(XPos + iWidth, YPos, ZPos);
  16.         glTexCoord2f(1,1); glVertex3f(XPos + iWidth, YPos + iHeight, ZPos);
  17.         glTexCoord2f(1,0); glVertex3f(XPos, YPos + iHeight, ZPos);
  18.       glEnd;
  19.     end;
  20. end;
  21.  

Sieht nicht wirklich falsch aus. Leider kommt es beim Ladeversuch der png-Datei in der glBitmap.pas zu einer Fehlermeldung.

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


Scheint logisch, da in der glBitmap.pas die png-Verarbeitung nicht explizit voreingestellt zu sein scheint.

Ich habe also diese Schalter aktiviert:
Code:
  1. {$define GLB_LIB_PNG}


Danach erhalte ich aber beim Debuggen diesen Fehler:
Zitat:
'LoadPNG - unable to initialize libPNG.'


So richtig weiß ich jetzt nicht mehr weiter.
Kann mir jemand weiter helfen - bitte?

Vielen Dank
Lg Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 09:25 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Ich habe noch etwas weiter getestet.
in der glBitmap.pas muss man ja nur für die png und die jpg einen Schalter aktivieren. Für TGAs ist das nicht der Fall. Dieses wird auch korrekt geladen. Zwar um 90 Grad verdreht, aber wenigstens schon mal was.

Ich habe also eventuell etwas beim Aktivieren der Schalter in der glBitmap falsch gemacht. Nur was?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 10:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
TGA ist (zumindest ohne Kompression) ein relativ einfaches Dateiformat. Deswegen kann die glBitmap.pas das wohl von sich aus. Bei jpg und png sieht das anders aus. Wahrscheinlich musst du noch libpng und zlib entweder statisch dazu linken oder als DLL bereitstellen (ich gehe mal davon aus, dass du Windows verwendest). Lies dir mal die Hinweise im Projektethread von glBitmap durch.

Dass glBitmap Texturen "falsch" gedreht lädt, glaube ich nicht. Wahrscheinlich hast du nur falsche Texturkoordinaten angegeben.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 12:24 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Hallöchen,

ich hab mich mal durchgebissen und es dann auch mit der glBitmap.pas hinbekommen.

Ich habe dort diese Sektionen aktiviert
Code:
  1. {$define GLB_DELPHI}
  2. {$define GLB_PNGIMAGE}


Danach erhielt ich eine Fehlermeldung, dass die Typen im pngHeader inkompatibel wären.
Ich habe dann die Deklaration und Verwendung testhalber geändert. Danach gings. ;-)

Code:
  1. var
  2.   //Header: Array[0..7] of Byte ;
  3.   Header: Array[0..7] of AnsiChar ;
  4.  
  5. const
  6.   //PngHeader: Array[0..7] of Byte = (#137, #80, #78, #71, #13, #10, #26, #10);
  7.   PngHeader: Array[0..7] of AnsiChar  = (#137, #80, #78, #71, #13, #10, #26, #10);


Jetzt kann ich TGA´s und PNG´s benutzen. Und wenn ich
Code:
  1.       glEnable(GL_BLEND);
  2.       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

benutze, werden die Bildchen auch schön transparent benutzt. Die Möglichkeiten sind da fast unbegrenzt.

Was ich beim Blending noch nicht so ganz verstehe, ist das überlappende Darstellen oder Zeichnen aller Bilder mit Transparenz, ohne das das in Z davorliegende Bild ein anderes mit seinem Alpha maskiert.

Klingt kompliziert...

Geht das?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 13:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wie das aktuelle Bild mit dem Puffer verrechnet wird, legt die von dir genutzte glBlendFunc fest.
Code:
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Dabei gibt es diverse Möglichkeiten und die Multiplikation z.B. ist unabhängig von der Reihenfolge aber Addition und Subtraktion nicht.
Hier sind ein paar Beispiele zu dem Verhalten.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Kann mir jemand einen Tipp geben, wie ich den png-Inhalt auf das Rectangle bringe?

Dies geht alles ohne fremde Bibliotheken.

Code:
  1. var
  2.   textureID0: GLuint;
  3.  
  4. procedure TForm1.Timer1Timer(Sender: TObject);
  5. begin
  6.   glClearColor(0.8, 0.5, 0.3, 1.0);
  7.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  8.   glEnable(GL_DEPTH_TEST);
  9.  
  10.   glMatrixMode(GL_PROJECTION);
  11.   glLoadIdentity();
  12.  
  13.   glMatrixMode(GL_MODELVIEW);
  14.   glLoadIdentity();
  15.  
  16.   // --- Textur Aktivieren
  17.  
  18.   glActiveTexture(GL_TEXTURE0);
  19.   glBindTexture(GL_TEXTURE_2D, textureID0);
  20.  
  21.   glRotatef(winkel, 0.0, 0.0, 1.0);
  22.  
  23.   glEnable(GL_TEXTURE_2D);
  24.  
  25.   glBegin(GL_QUADS);
  26.   glTexCoord2f(0.0, 0.0);
  27.   glVertex3f(-0.8, -0.8, 0);
  28.   glTexCoord2f(1.0, 0.0);
  29.   glVertex3f(-0.8, 0.8, 0);
  30.   glTexCoord2f(1.0, 1.0);
  31.   glVertex3f(0.8, 0.8, 0);
  32.   glTexCoord2f(0.0, 1.0);
  33.   glVertex3f(0.8, -0.8, 0);
  34.   glEnd();
  35.  
  36.   OpenGLControl1.SwapBuffers;
  37. end;
  38.  
  39.  
  40. procedure TForm1.FormCreate(Sender: TObject);
  41. var
  42.   pic: TPicture;
  43. begin
  44.   InitOpenGL;
  45.   OpenGLControl1.MakeCurrent;
  46.   ReadExtensions;
  47.   ReadImplementationProperties;
  48.  
  49.   glEnable(GL_BLEND);
  50.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  51.  
  52.   glEnable(GL_DEPTH_TEST);
  53.   glDepthFunc(GL_LESS);
  54.  
  55.   pic := TPicture.Create;
  56.   pic.LoadFromFile('test.png');     // Es gehen auch jpg/bmp/ico
  57.  
  58.  
  59.   // ------------ Texturen laden --------------
  60.  
  61.   with pic.Bitmap do begin
  62.     glGenTextures(1, @textureID0);
  63.     glBindTexture(GL_TEXTURE_2D, textureID0);
  64.  
  65.   // Hier Anpassungen  vornehmen, wen die Textur keinen Alpha-Kanal hat.
  66.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, RawImage.Data);
  67.  
  68.     glGenerateMipmap(GL_TEXTURE_2D);
  69.   end;
  70.  
  71.   pic.Free;
  72.  
  73.   glMatrixMode(GL_TEXTURE);  // Textur Scalieren
  74.   glLoadIdentity();
  75.   glScalef(3.3, 3.3, 3.3);
  76. end;
  77.  
  78. procedure TForm1.FormDestroy(Sender: TObject);
  79. begin
  80.   glDeleteTextures(1, @textureID0);
  81. end;

_________________
OpenGL


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


Wer ist online?

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