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

Aktuelle Zeit: Mi Jul 16, 2025 09:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Nov 22, 2003 13:13 
Offline
DGL Member

Registriert: So Jun 23, 2002 12:37
Beiträge: 144
Programmiersprache: C/C++, Delphi
Hallo,

ich hab jetzt hier eine Textur auf ein Quad gelegt und eine zweite Textur darübergelegt(blending hab ich aktiviert, für nen übergang). Wie kann ich jetzt das ganze gebilde als eine (statt zwei) bilddateien wieder auf meiner Platte abspeichern??

_________________
--->ladida<---


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 13:44 
Offline
DGL Member

Registriert: So Sep 21, 2003 18:29
Beiträge: 15
Wohnort: Süd Afrika
Die einfachste art ist ein screenshot. Wenn du glOrtho gebrauchst
dann kriegst du die texture auch genau von vorne.

Vielleicht muss man denn bi-linear filter ausschalten um bessere reultate zu kriegen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 14:18 
Offline
DGL Member

Registriert: So Jun 23, 2002 12:37
Beiträge: 144
Programmiersprache: C/C++, Delphi
An sowas hab ich ja auchschon gedacht...

Kann ich denn mit glCopyTexImage2D() nicht irgendwas machen?? Aber was übergebe ich denn dann an den "Target"-Parameter??

Oder gibts da ne andere, bessere Möglichkeit??

_________________
--->ladida<---


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 14:18 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Oder viel besser wäre wenn du das ganz ohne OpenGL machen würdest. Also einfach 2 Bilder in zum Beispiel ein TBitmap laden, und dann die Daten entsprechend zusammenrechnen und in ein drittes TBitmap laden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
OpenGL hat viele Bildbearbeitungsfunktionen integriert - insbesondere, wenn die ARB_imaging Erweiterung dabei ist.
Von daher ist es keine schlechte Idee, OpenGL zur 2D Bildbearbeitung zu verwenden. MesaGL hat diese z.B. - und man kann damit auch vollständig in einem Offscreenbuffer arbeiten.

Um ein OpenGL Szene in ein Bitmap zu bekommen kann einfach glReadPixels verwendet werden.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 15:00 
Offline
DGL Member

Registriert: So Jun 23, 2002 12:37
Beiträge: 144
Programmiersprache: C/C++, Delphi
Wenn ich die glReadPixels() verwende, muss ich bei den x- und y-Parametern die untere, linke Ecke von dem was ich haben will angeben oder vertue ich mich da jetzt... Width und Height is klar aber bei den Format und Type Parametern haperts...

Was muss ich für eine Konstante bei dem Format angeben:
-GL_Red, GL_Green oder GL_Blue
-GL_RGB oder GL_BGR
-GL_RGBA oder GL_BGRA

Und was für den Typ??

Und wenn ich dann die Pixeldaten in nem eindimensionalem Array hab, kann ich die dann einfach mit SetDIBitsToDevice() an irgendein Bitmap übergeben?

_________________
--->ladida<---


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 15:34 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Der Nullpunkt ist bei OpenGL unten links (wie aus der Schule gewohnt :wink: ).

Das Format musst du selbst entscheiden - meistens GL_BGR oder GL_BGRA wenn du mit Windows Bitmaps arbeitest, ansonsten GL_RGB oder GL_RGBA.

Als Typ wirst du wahrscheinlich GL_UNSIGNED_BYTE haben wollen - es sei denn, du willst irgendwas Exotisches machen.

Ob ein Array ein- oder mehrdimensional ist, ist dem Computer so ziemlich wurscht. Auch bei einem Array[0..99, 0..99] of Byte sind alle Daten hintereinander abgelegt und es entspricht einem Array[0..9999] of Byte - mehrdimensionale Felder sind Hilfsmittel für Programmierer, mehr nicht.

Am Einfachsten (allerdings nicht am Schnellsten, in der Praxis merkst du's aber ohnehin nicht) tust du dir, wenn du ein TBitmap kreierst, Breite, Höhe und Pixelformat festlegst, und dann Zeilenweise die ausgelesenen Daten rüberschiebst (ScanLine verwenden).
Natürlich kannst du auch den Bitmap Header nachbauen, genügend Speicher reservieren, die OpenGL Pixel direkt in den Datenbereich des Pixels einlesen und das ganze Zeugs direkt auf der Festplatte als .bmp ablegen oder sonst was machen damit (Bitmap Format ist ja sehr einfach) - das geht dann extrem schnell.
Aufpassen musst du dabei, dass bei Windows Bitmaps Breite und Höhe immer durch durch vier teilbar sein müssen - ein 2 Pixel breites Bild wird also intern mit vier Pixel Breite abgespeichert. TBitmap nimmt es dir aber ab, dir darüber den Kopf zu zerbrechen.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Hier hast du den Code, wie ich in Carad eine dynamische (in Echtzeit berechnete) 2D-Textur für die Vorschau in ein 32x32 Pixel großes Bitmap bekomme:

Code:
  1. {}{$IFDEF CARAD}
  2. {}    glViewport(0, 0, 32, 32);
  3. {}    glMatrixMode(GL_PROJECTION);
  4. {}    glLoadIdentity;
  5. {}    gluPerspective(45, 1, 0.1, 10);
  6. {}    glMatrixMode(GL_MODELVIEW);
  7. {}    glLoadIdentity;
  8. {}    glClear(bgClearBufferBits);
  9. {}    glEnable(GL_TEXTURE_2D);
  10. {}    {$IFDEF GL_12} if GL_12 then glDisable(GL_TEXTURE_3D); {$ENDIF}
  11. {}    {$IFDEF GL_13} if GL_13 then glDisable(GL_TEXTURE_CUBE_MAP); {$ENDIF}
  12. {}    glDisable(GL_LIGHTING);
  13. {}    glBegin(GL_QUADS);
  14. {}       glColor3f(1,1,1);
  15. {}       glTexCoord2f(0, 0);
  16. {}       glVertex3f(-0.5, -0.5, -1);
  17. {}       glTexCoord2f(1, 0);
  18. {}       glVertex3f( 0.5, -0.5, -1);
  19. {}       glTexCoord2f(1, 1);
  20. {}       glVertex3f( 0.5,  0.5, -1);
  21. {}       glTexCoord2f(0, 1);
  22. {}       glVertex3f(-0.5,  0.5, -1);
  23. {}    glEnd;
  24. {}    glReadPixels(0,0,32,32,GL_RGBA, GL_UNSIGNED_BYTE, Addr(pixels));
  25. {}    glEnable(GL_LIGHTING);
  26. {}    for j := 0 to 31 do begin
  27. {}      line := img.ScanLine[31-j];
  28. {}      for i := 0 to 31 do begin
  29. {}        pixel := pixels[j][i];
  30. {}        b := pixel.r;
  31. {}        pixel.r := pixel.b;
  32. {}        pixel.b := b;
  33. {}        pixel.a := not(pixel.a);
  34. {}        line[i] := pixel;
  35. {}      end;
  36. {}    end;
  37. {}{$ENDIF}
  38.  


Die Kompileroptionen und die geschwungenen Klammern musst du dir weg denken - ich arbeite nicht direkt an BaseGraph, vielmehr wird diese Bibliothek über ein eigenes Programm aus vielen Modulen selbst wiederum zusammenkompiliert. Verschiedene Teile sind für erstellte Anwendungen uninteressant, sondern finden nur in Carad selbst Verwendung - darunter auch die Vorschau für Texturen (dies erspart mir auch einige Portierarbeit für die C und C++ Versionen).

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 16:46 
Offline
DGL Member

Registriert: So Jun 23, 2002 12:37
Beiträge: 144
Programmiersprache: C/C++, Delphi
Jo danke ich werds gleich mal ausprobieren...

_________________
--->ladida<---


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2003 17:37 
Offline
DGL Member

Registriert: So Jun 23, 2002 12:37
Beiträge: 144
Programmiersprache: C/C++, Delphi
Funktioniert super... Danke euch allen....

_________________
--->ladida<---


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 9 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.010s | 16 Queries | GZIP : On ]