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

Aktuelle Zeit: Mo Nov 20, 2017 00:50

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jul 15, 2016 16:47 
Offline
DGL Member

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

ich habe mal ein Beispiel erstellt, dass sehr Basic ist, aber vielleicht mein Problem etwas veranschaulicht.
Ich möchte ein Bild mit Transparenten Bereichen rendern. Sprich, wenn ich keine Objekte der Szenerie hinzugefügt habe, sollte eigentlich ein komplett schwarzes Bild mit 100% schwarzem Alpha-Kanal gerendert werden. Wäre in der Mitte ein Bild, sollte nur das Bild zu sehen und im Alpha-Kanal an der Stelle des Bildes ein weißer Kasten.

Ich habe mir das Beispiel mal von DelphiGL genommen und die Routine Screenshot benutzt.

Wenn man im Programm den Button Render betätigt, wird erwartungsgemäß das Bild so gerendert, wie im Tutorial.
Will ich es speichern, erhalte ich zwar eine TGA-Datei, ABER
-> der Inhalt ist komplett schwarz
-> es ist kein Alpha-Kanal vorhanden

Einzig die Abmaße stimmen.

Ich habe dann bei GetReadPixels das Format von GL_BGR nach GL_BGRA umgestellt und vorher noch die Datengröße

von
DataSize := Width * Height * 3;

geändert
DataSize := Width * Height * 4;

um Platz für Alphakanal zu schaffen.

Ich finde leider den Fehler nicht...
Ich hänge mal das Projekt an.

Würde mich sehr freuen, wenn ich Hilfe von Euch bekommen könnte.

Vielen Dank
Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 15, 2016 22:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Ja klingt sehr danach als würdest du dein TGA falsch aufsetzen. Also falscher Header oder Daten falsch abgelegt...

Hat Delphi hier keine vorgefertigten Sachen für PNG oder so, denen du das einfach deinen Buffer reinschieben kannst? Dann sollte
es gehen... oder zumindest schon einmal häßlich aussehen :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jul 16, 2016 13:34 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 196
http://www.delphipraxis.net/189402-open ... ost1342763


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Nov 29, 2016 11:08 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 25
Hm, ich weiß - es ist schon ein paar Tage her, dass ich hier bezüglich des Thema gepostet habe.
Das Problem scheint aber weiterhin teilweise aktuell zu sein.

Das Rendern und Erzeugen des TGA´s mit korrektem Alpha funktioniert nur auf meinem Laptop richtig. Auf meinem Büro-Rechner sieht das gerenderte Bild richtig aus, aber die Alpha-Kanala ist immer komplett weiß.

Komplett gleiche Sourcen. Also ich benutze die gleiche exe auf Laptop und PC und erhalte verschiedene Ergebnisse.
Beide Systeme benutzen eine NVidia-Karte. Sicher nicht mit gleichen Treibern und Versionen, aber wer kann mir sagen, woran dieses Problem liegen könnte?

Ich mach notfalls auch einen neuen Thread auf und stell die Sourcen zur Verfügung.

Danke Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 30, 2016 18:15 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 203
Programmiersprache: c++, c, JavaScript
Vielleicht kann deine eine Karte bzw. der Treiber nix mit dem Texturformat anfangen und nimmt ein anderes her (eins ohne alpha).
Texturformat könnte sowohl beim schreiben (drwacall o.Ä.) als auch beim Lesen (glReadpixels) Probleme machen.
Ist es denn das gleiche Betriebssystem?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2016 08:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Hi am besten du zeigst hier einmal deinen Code für den Context und ReadPixel, dann sollte klar sein wo der Hase begraben liegt.

_________________
Meine Homepage


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

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

ich habe es jetzt nochmals (ich weiß, es ist schon eine Weile her) nochmals auf verschiedenen Systemen ausprobiert.

Alle Rechner haben eine NVidia-Karte. Mein Laptop hat eine Intel on Board und eine dezidierte NVidia. Alle Rechner haben Win7 Pro. Auf allen Rechnern habe ich eine CG-Live-Rendering-Software getestet, die 3D-Live in Echtzeit mit Alpha rendert. Das geht überall. Das Problem muss also in meinen Sourcen liegen.

Ich hänge das Projekt mal an. Vielleicht fällt jemandem etwas auf.
Ich versuche auch noch die korrekte TGA mit richtigem Alpha und die "falsche" anzuhängen. Die falsche liegt aber in dem gepackten Projektordner.

Erstellt habe ich das Projekt mit Delphi7.
https://www.dropbox.com/s/lifgeou1byy3ezw/OrthoPixelTestForum.rar?dl=0

Das gerenderte TGA mit korrektem Alpha liegt hier:
https://www.dropbox.com/s/as7ltmih9ibe54c/test_mit_Alpha.tga?dl=0
Man sieht im Programm schon, wenn man Render drückt, ob es mit dem Alpha klappt oder nicht. Wenn das Image im Programm transparent dargestellt wird, klappt es mit dem Alpha. Ist der Hintergrund schwarz klappt es mit dem Alpha nicht.

Das gerenderte Bild mit falschem Alpha liegt hier:
https://www.dropbox.com/s/9i3b8yy5om7jain/test.tga?dl=0
Wenn man sich den Alpha - der durchaus vorhanden ist, mal im PS anschaut fällt auf, dass dieser echt komisch ist.

Freue mich auf konstruktive Hinweise und helfende Hände. Warum gehts hier und da nicht?

Lg Tom

ps.: Suche immer noch einen Freelancer - auch für dieses kleine Projekt.


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

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 25
Hat keiner eine Idee, woran es liegen könnte?


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

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1055
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Hast du mal versucht, ein Mini-Code zu kompilieren.
Ein einfaches Rechteck mit einer Textur ?

Somit ist es viel einfacher den Fehler zu suchen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 19, 2017 09:32 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 25
Hier mal der stark eingekürzte Code.
Auf dem Form befindet sich ein Button, der das Rendern des Inhaltes auslöst. Diesen muss man manchmal 2 mal drücken, damit er rendert.
Darunter befindet sich ein Button, der das gerenderte nach test.tga speichert.
Auf meinem Büro-PC mit NVidia Quadro M2000 ist der Alpha-Kanal immer komplett weiß.
Auf meinem Laptop mit Quadro K1100M erzeugt die gleiche exe ein Bild, mit korrektem Alpha.

Code:
  1. unit frmMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, DGLOpenGL, StdCtrls, ExtCtrls, OpenGLTools, glBitmap, libPNG;
  8.  
  9. type
  10.   TTGAHEADER = packed record
  11.     tfType : Byte;
  12.     tfColorMapType : Byte;
  13.     tfImageType : Byte;
  14.     tfColorMapSpec : Array[0..4] of Byte;
  15.     tfOrigX : Word; //Array [0..1] of Byte;
  16.     tfOrigY : Word;
  17.     tfWidth : Word;
  18.     tfHeight : Word;
  19.     tfBpp : Byte;
  20.     tfImageDes : Byte;
  21.   end;
  22.  
  23. type TRGBAColor = Array[0..3] of Single;
  24.  
  25. type
  26.   TForm1 = class(TForm)
  27.     btnRenderToTga: TButton;
  28.     btnRender: TButton;
  29.     Image1: TImage;
  30.     procedure FormCreate(Sender: TObject);
  31.     procedure FormDestroy(Sender: TObject);
  32.     procedure btnRenderToTgaClick(Sender: TObject);
  33.     procedure btnRenderClick(Sender: TObject);
  34.   private
  35.     procedure SetupGL;
  36.     procedure Render;
  37.     { Private-Deklarationen }
  38.   public
  39.     { Public-Deklarationen }
  40.   end;
  41.  
  42. var
  43.   Form1: TForm1;
  44.   DC, RC:HDC;
  45.   FontLists: Cardinal;
  46.   Font: TFont;
  47.  
  48. const NearClipping = 1;
  49.       FarClipping  = 1000;
  50.       screenWidth = 1920;
  51.       screenHeight = 1080;
  52.  
  53. implementation
  54.  
  55. uses StdVCL, frmDC;
  56.  
  57. {$R *.dfm}
  58.  
  59. procedure TForm1.FormCreate(Sender: TObject);
  60. begin
  61.   DoubleBuffered := True;
  62.  
  63.   DCForm := TDCForm.Create(Form1);
  64.   DCForm.Width := 1920;
  65.   DCForm.Height := 1080;
  66.   DCForm.Visible := false;
  67.   DC:= GetDC(DCForm.Handle);
  68.  
  69.   if not InitOpenGL then Application.Terminate;
  70.   RC:= CreateRenderingContext( DC,
  71.                                [opDoubleBuffered],
  72.                                32,
  73.                                24,
  74.                                0,0,0,
  75.                                0);
  76.   ActivateRenderingContext(DC, RC);
  77.   SetupGL;
  78.  
  79. end;
  80.  
  81. procedure TForm1.SetupGL;
  82. begin
  83.   //Texture wird vorher gebunden
  84.  glDisable(GL_DEPTH_TEST);
  85.  glEnable(GL_BLEND);
  86.  glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  87.   //Render...
  88.  glDisable(GL_BLEND);
  89.  glEnable(GL_DEPTH_TEST);
  90. end;
  91.  
  92.  
  93. procedure TForm1.FormDestroy(Sender: TObject);
  94. begin
  95.   DeactivateRenderingContext;
  96.   DestroyRenderingContext(RC);
  97.   ReleaseDC(Handle, DC);
  98. end;
  99.  
  100. procedure TForm1.Render;
  101. var
  102.   bmp: Tbitmap;
  103. begin
  104.   SetupGL;
  105.  
  106.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  107.  
  108.   glMatrixMode(GL_PROJECTION);
  109.   glLoadIdentity();
  110.   glViewport(0, 0, screenWidth, screenHeight);
  111.   glMatrixMode(GL_MODELVIEW);
  112.   glLoadIdentity();
  113.   glOrtho(0, screenWidth, 0, screenHeight, 1000, -1000); // Origin in lower-left corner
  114.  
  115.   //blaues 4-eck
  116.   glBegin(GL_QUADS);
  117.     glColor3f(0, 0, 1); glVertex2f(800, 100);
  118.     glColor3f(0, 0, 1); glVertex2f(1000, 100);
  119.     glColor3f(0, 0, 1); glVertex2f(1000, 300);
  120.     glColor3f(0, 0, 1); glVertex2f(800, 300);
  121.   glEnd;
  122.  
  123.   {bunte box mit verschiedenen transparenzen}
  124.   glBegin(GL_QUADS);
  125.     glColor4f(0, 1, 1, 1);    glVertex2f(600, 500);
  126.     glColor4f(1, 0, 1, 0.75); glVertex2f(800, 500);
  127.     glColor4f(1, 1, 0, 0.5);  glVertex2f(800, 800);
  128.     glColor4f(1, 0, 0, 0);    glVertex2f(600, 800);
  129.   glEnd;
  130.  
  131.    glDisable(GL_BLEND);
  132.    glEnable(GL_DEPTH_TEST);
  133.  
  134.    SwapBuffers(DC);
  135.  
  136.     bmp := TBitmap.Create;
  137.     try
  138.       GetBitmapFromOpenGL(bmp);
  139.       Image1.Picture.Assign(bmp);
  140.     finally
  141.       FreeAndNil(bmp);
  142.     end;
  143. end;
  144.  
  145. procedure ScreenShot(const Name : string);
  146. var
  147.   DataBuffer : array of Byte;
  148.   f : file;
  149.   tgaHeader : TTGAHEADER;
  150.   width, height : integer;
  151.   DataSize:Integer;
  152.   viewport : Array[0..3] of integer;
  153. begin
  154.   //Viewport-Größe lesen
  155.   glGetIntegerv(GL_VIEWPORT, @viewport);
  156.   width := viewport[2];
  157.   height := viewport[3];
  158.  
  159.   //Größe der Daten berechnen
  160.   DataSize := Width * Height * 4;
  161.  
  162.   //Größe des Puffers festlegen (Speicher reservieren)
  163.   SetLength(DataBuffer,DataSize);
  164.  
  165.   // TGA Kopf mit Daten füllen
  166.   ZeroMemory(@tgaHeader, SizeOf(tgaHeader));
  167.   tgaHeader.tfImageType := 2; // TGA_RGB = 2
  168.   tgaHeader.tfWidth := Width;
  169.   tgaHeader.tfHeight := Height;
  170.   tgaHeader.tfBpp := 32;
  171.  
  172.   //Daten von OpenGL anfordern
  173.   glReadPixels(0,0,Width, Height, GL_BGRA, GL_UNSIGNED_BYTE, @DataBuffer[0]);
  174.  
  175.   //Datei erstellen
  176.   AssignFile(f, Name);
  177.   Rewrite( f,1 );
  178.   try
  179.     // TGA Kopf in die Datei reinschreiben
  180.     BlockWrite(F, tgaHeader, SizeOf(tgaHeader));
  181.  
  182.     // Die eigentlichen Bilddaten in die Datei schreiben
  183.     BlockWrite(f, DataBuffer[0], DataSize );
  184.   finally
  185.     CloseFile(f);
  186.   end;
  187. end;
  188.  
  189. procedure TForm1.btnRenderToTgaClick(Sender: TObject);
  190. begin
  191.   ScreenShot('test.tga');
  192. end;
  193.  
  194. procedure TForm1.btnRenderClick(Sender: TObject);
  195. begin
  196.   Render;
  197. end;
  198.  
  199. end.
  200.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 19, 2017 22:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1055
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Auf meinem Büro-PC mit NVidia Quadro M2000 ist der Alpha-Kanal immer komplett weiß.
Auf meinem Laptop mit Quadro K1100M erzeugt die gleiche exe ein Bild, mit korrektem Alpha.

Wen der Code nicht 100% der OpenGL-Norm entspricht, kann so was passieren.

Was ist eigentlich dein Ziel, willst du ein Bild rendern, und dieses als TGA abspeichern ?

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.019s | 18 Queries | GZIP : On ]