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

Aktuelle Zeit: Do Mär 28, 2024 09:38

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Mi Nov 22, 2017 20:22 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Hm, irgendwas scheint noch nicht zu stimmen, denn leider ist es immer noch nicht mit korrektem Alpha:

Code:
  1. procedure TForm1.SetupGL;
  2. begin
  3.   glEnable(GL_BLEND);
  4.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  5.  
  6.   glEnable(GL_DEPTH_TEST);
  7.   glDepthFunc(GL_LESS);
  8. end;
  9.  
  10.  
  11. procedure TForm1.FormDestroy(Sender: TObject);
  12. begin
  13.   DeactivateRenderingContext;
  14.   DestroyRenderingContext(RC);
  15.   ReleaseDC(Handle, DC);
  16. end;
  17.  
  18. procedure TForm1.Render;
  19. var
  20.   bmp: Tbitmap;
  21. begin
  22.   SetupGL;
  23.  
  24.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  25.  
  26.   glMatrixMode(GL_PROJECTION);
  27.   glLoadIdentity();
  28.   glViewport(0, 0, screenWidth, screenHeight);
  29.   glMatrixMode(GL_MODELVIEW);
  30.   glLoadIdentity();
  31.   glOrtho(0, screenWidth, 0, screenHeight, 1000, -1000); // Origin in lower-left corner
  32.  
  33.   //blaues 4-eck
  34.   glBegin(GL_QUADS);
  35.     glColor3f(0, 0, 1); glVertex2f(800, 100);
  36.     glColor3f(0, 0, 1); glVertex2f(1000, 100);
  37.     glColor3f(0, 0, 1); glVertex2f(1000, 300);
  38.     glColor3f(0, 0, 1); glVertex2f(800, 300);
  39.   glEnd;
  40.  
  41.   {weiße box}
  42.   glBegin(GL_QUADS);
  43.     glColor4f(0, 1, 1, 1);    glVertex2f(600, 500);
  44.     glColor4f(1, 0, 1, 0.75); glVertex2f(800, 500);
  45.     glColor4f(1, 1, 0, 0.5);  glVertex2f(800, 800);
  46.     glColor4f(1, 0, 0, 0);    glVertex2f(600, 800);
  47.   glEnd;
  48.  
  49.    //glDisable(GL_BLEND);
  50.    //glEnable(GL_DEPTH_TEST);
  51.  
  52.    SwapBuffers(DC);
  53.  
  54.     bmp := TBitmap.Create;
  55.     try
  56.       GetBitmapFromOpenGL(bmp);
  57.       Image1.Picture.Assign(bmp);
  58.     finally
  59.       FreeAndNil(bmp);
  60.     end;
  61. end;


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 22, 2017 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Im Anhang, habe ich einen Lazarus Code, welcher etwas in eine Textur rendert, welche einen Baum enthält und anschliessend wird diese Textur auf einem Würfel abbildet.
Diese Textur kann man als png abspeichern.
Es wird OpenGL 3.3 verwendet.

Vielleicht hilft dir dieser Code weiter. :wink:

Evtl, könntest du die Abbildung auf dem Würfel sparen, und die Textur direkt in den TGA speichern.

Dies ist der Kern. für das Textur rendern.
Code:
  1. var
  2.       // Render Bufffer
  3.     FramebufferName, depthrenderbuffer: GLuint;
  4. .....
  5.   // ------------ Texturen laden --------------
  6.  
  7.   // --- Textur 0
  8.  
  9.   glGenTextures(1, @textureID0);
  10.   glBindTexture(GL_TEXTURE_2D, textureID0);
  11.  
  12.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexturSize, TexturSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
  13.  
  14.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  15.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  16.  
  17.   // Frame Buffer erzeugen
  18.  
  19.   glGenFramebuffers(1, @FramebufferName);
  20.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  21.  
  22.   glGenRenderbuffers(1, @depthrenderbuffer);
  23.   glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer);
  24.  
  25.   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TexturSize, TexturSize);
  26.   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer);
  27.  
  28.   glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID0, 0);  

_________________
OpenGL


Zuletzt geändert von mathias am Fr Nov 24, 2017 18:20, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 24, 2017 07:23 
Offline
DGL Member

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

vielen Dank für Deine Mühe!

Ich schau´s mir mal an. Vielleicht komme ich klar damit. Ich hatte eigentlich gehofft, dass jemand einen Fehler in meinem Code sieht, der dafür sorgt, dass der Alpha nicht auf all meinen Systemen sauber erstellt wird. Ich versuch mich mal durch Deinen Code zu lesen. Lässt sich ja sicher auch nach Delphi "portieren". ;-)

Lg Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 24, 2017 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Lässt sich ja sicher auch nach Delphi "portieren".

Noch einfacher, installiere Lazarus, dann läuft es sicher.

Noch etwas zu deinem Code, bei glVertexf hast du sehr grosse Werte.

Wen ich so hohe Textur-Vertex Werte bei meiner Demo eingebe, kommt anstelle des Baumes nur einen Brei. ( Siehe Anhang )

Bei meiner Demo hat sich ein Fehler eingeschlichen, lade bitte die neue Version im Anhang runter. :oops:


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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 09:06 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Dank soweit.
Ich lade mir heute mal Lazarus herunter und teste Deinen Code.
Ick melde mir. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 10:04 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
So, Lazarus ist installiert. Lies sich aber nicht im Standard-Ordner für Programme installieren, weil ein Leerzeichen im Pfad vorkam.
Wenn ich Dein Projekt öffne

Wenn ich das Projekt kompilieren will, erhalte ich die Fehlermeldung:
Zitat:
[Window Title]
Abhängigkeit nicht erfüllt

[Content]
Das Projekt benötigt das Package "ogl_Package".
Es wurde aber nicht gefunden. Siehe Projekt -> Projektinspektor.

Habe den Eintrag aus dem Projekt entfernt und die dglOpenGl.pas aus meinem Delphi-Projekt verwendet, da die auch fehlte. Damit gings aber und ich konnte alles schon mal kompilieren.

Der Würfelt dreht sich und auf dem Würfel sehe ich sich drehende Bäume auf blauen Flächen.
Drücke auf den Button erhalte ich eine Fehlermeldung:
Zitat:
[Window Title]
Fehler
[Content]
Projekt project1 hat Exception-Klasse »External: SIGSEGV« ausgelöst.
Bei Adresse 69627A32


hab einen Haltepunkt gesetzt. Der Fehler liegt wohl hier:
Code:
  1. glReadPixels(0, 0, TexturSize, TexturSize, GL_BGRA, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);
  2. SaveToFile('test.png');


Ciao Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Drücke auf den Button erhalte ich eine Fehlermeldung:
Da hat mir Windoof eine Strich durch die Rechnung gemacht. :twisted: Bei Windoof ist die Pixelgrösse auf dem Image bei default 24Bit, bei Linux 32Bit.

Versuche mal folgendes:
Code:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   with Form2.Image1.Picture do begin
  4.     Bitmap.PixelFormat := pf32bit;  // neu
  5. //    Bitmap.Clear;
  6.     Bitmap.Width := TexturSize;

Ich kann es leider nicht mit ReadPixels testen, da Wine bei mir kein OpenGL kann.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 17:50 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Jo, darauf hätte ich auch kommen können.
Also die Erweiterung png scheint nicht ok zu sein. IrfanView teilt mir beim Öffnen gleich mit, dass es wohl eine bmp sein müsste.
Ein Alpha-Kanal ist vorhanden. Allerdings komplett weiß.
Die Datei ist riesig - 4096 * 4096 pixel. 67 Megabyte. ;-)
Also es funktioniert, aber leider ohne korrekten Alpha...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 18:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Also die Erweiterung png scheint nicht ok zu sein. IrfanView teilt mir beim Öffnen gleich mit, dass es wohl eine bmp sein müsste.
Komisch, bei mir ist sie nur etwa 400KB gross. Mache ich test.bmp, dann ist sie auch 67MB gross.
Hast du SaveToFile auf Bitmap angewendet anstelle von Picture ?

Hier nochmals die ganze Procedure:
Code:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   with Form2.Image1.Picture do begin
  4.     Bitmap.PixelFormat := pf32bit;
  5. //    Bitmap.Clear;
  6.     Bitmap.Width := TexturSize;
  7.     Bitmap.Height := TexturSize;
  8.     glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  9.     glReadPixels(0, 0, TexturSize, TexturSize, GL_BGRA, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);
  10.  
  11.     SaveToFile('test.png');
  12.   end;
  13.   Form2.ShowModal;
  14. end;  


Zitat:
Ein Alpha-Kanal ist vorhanden. Allerdings komplett weiß.
Evtl. muss man bei glReadPixel GL_BGRA durch GL_RGBA ersetzen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 19:28 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
mathias hat geschrieben:
Hast du SaveToFile auf Bitmap angewendet anstelle von Picture? 
Stimmt, ich hatte den Code auf Bitmap.SaveToFile geändert, bei der Suche nach dem vorherigen Fehler.

Zitat:
Evtl. muss man bei glReadPixel GL_BGRA durch GL_RGBA ersetzen.
Leider hat das auch nicht funktioniert. In der Png-Datei wird gar kein Alpha-Kanal angelegt.

Vielleicht bau ich ja mal meinen TGA-Code ein und schaue, ob dort der Alpha entsteht.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 19:50 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Ich hab mal diesen TGA-Code eingefügt, aber da ist sicher noch was falsch:

Code:
  1. procedure TForm1.btnExportToTgaClick(Sender: TObject);
  2. var
  3.   DataBuffer : array of Byte;
  4.   f : file;
  5.   tgaHeader : TTGAHEADER;
  6.   iWidth, iHeight : integer;
  7.   DataSize:Integer;
  8.   viewport : Array[0..3] of integer;
  9. begin
  10.   //Viewport-Größe lesen
  11.   glGetIntegerv(GL_VIEWPORT, @viewport);
  12.   iWidth := viewport[2];
  13.   iHeight := viewport[3];
  14.  
  15.   //Größe der Daten berechnen
  16.   DataSize := iWidth * iHeight * 4;
  17.  
  18.   //Größe des Puffers festlegen (Speicher reservieren)
  19.   SetLength(DataBuffer,DataSize);
  20.  
  21.   // TGA Kopf mit Daten füllen
  22.   //ZeroMemory(@tgaHeader, SizeOf(tgaHeader));  //konnte nicht gefunden werden unter Lazarus
  23.   tgaHeader.tfImageType := 2; // TGA_RGB = 2
  24.   tgaHeader.tfWidth := iWidth;
  25.   tgaHeader.tfHeight := iHeight;
  26.   tgaHeader.tfBpp := 32;
  27.  
  28.   //Daten von OpenGL anfordern
  29.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  30.   glReadPixels(0,0,Width, Height, GL_BGRA, GL_UNSIGNED_BYTE, @DataBuffer[0]);
  31.  
  32.   //Datei erstellen
  33.   AssignFile(f, 'test.tga');
  34.   Rewrite( f,1 );
  35.   try
  36.     // TGA Kopf in die Datei reinschreiben
  37.     BlockWrite(F, tgaHeader, SizeOf(tgaHeader));
  38.  
  39.     // Die eigentlichen Bilddaten in die Datei schreiben
  40.     BlockWrite(f, DataBuffer[0], DataSize );
  41.   finally
  42.     CloseFile(f);
  43.   end;
  44. end;


Wenn ich
Code:
  1.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  2.  

anschalte ist ein Alpha zu sehen, komplett schwarz, also nichts zu sehen. Auch kein Inhalt in der Ebene.

Wenn man diesen Code ausmarktiert, sind die Bäum zu sehen. Der Alpha ist komplett weiß, nur am oberen Rand ist ein schwarzer Streifen.

Im Render Scene habe ich mal
Code:
  1.   glClearColor(0.0, 0.0, 0.0, 0.0);

auf komplett 0 geändert, damit erstmal alles schwarz und transparent wird. War ein Versuch aus Verzweiflung heraus.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Die TGA kann man sehr einfach haben.

Lade hier BGRABitmap v9.5 runter https://github.com/bgrabitmap/bgrabitma ... s/tag/v9.5 und installiere dies Komponente.

Folgende Unit hinzufügen " BGRABitmap"

Mit folgendem kleinen Code wird eine TGA erzeugt.
Code:
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   bit:TBGRABitmap;
  4. begin
  5.   bit:=TBGRABitmap.Create(TexturSize, TexturSize);
  6.  
  7.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  8.   glReadPixels(0, 0, TexturSize, TexturSize, GL_RGBA, GL_UNSIGNED_BYTE, bit.Data);
  9.  
  10.   bit.SaveToFile('test.tga');
  11.   bit.Free;
  12. end;


Aber ich würde die PNG anstelle TGA empfehlen, da dieses viel weniger Platz braucht.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 20:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Im Render Scene habe ich mal
Code:
  1.  glClearColor(0.0, 0.0, 0.0, 0.0);


auf komplett 0 geändert, damit erstmal alles schwarz und transparent wird. War ein Versuch aus Verzweiflung heraus.

Da hast du vollkommen recht, der Hintergrund der Textur muss transparent sein. Jetzt weis ich endlich, für was der 4 Wert in glClearColor ist. :idea:
Auf dem Bildschirm hat dieser keinen Einfluss, aber in einem FrameBuffer schon.

Man kann immer noch viel lernen. :wink:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 21:24 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Konntest Du denn eine Datei mit korrektem Alpha erzeugen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 25, 2017 21:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ja, siehe Anhang.

Ich habe die Textur noch ein wenig verkleinert.


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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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.036s | 17 Queries | GZIP : On ]