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

Aktuelle Zeit: Mi Apr 25, 2018 11:21

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



Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Fr Jul 15, 2016 16:47 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
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: 36
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: 221
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: 36
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: 36
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: 1127
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: 36
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: 1127
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  
BeitragVerfasst: Mi Nov 22, 2017 09:48 
Offline
DGL Member

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

als grobes Fernziel wäre ein eigener Renderer erwünscht, der in Full-HD in Echtzeit Templates läd, mit via TCP-IP übergebenen Daten Textobjekte inhaltlich ersetzt, Bilddateien ersetzt (z.B. bei Flaggen) und animiert.

Der dabei enstehende Bildstream sollte in Echtzeit auf einer Videokarte ausgeben werden.
Alle bisher gefundenen bereits geschriebenen Engines sind leider nicht in der Lage (z.b. konnte ich noch keinen Freelancer finden, der es hinbekam), einen RenderStream mit Alpha zu erzeugen. Ich weiß, dass Unity3d es kann, aber aktuell ist mir das zu mächtig.

Nahziel wäre erstmal
  • das Rendern mit Alpha (breits hier hakt es - der Zwischenschritt mit dem TGA schien mir nötig)
  • das Erzeugen von Teamplates (notfalls erstmal als XML-Datei mit Nodepad)
  • das Laden von Templates und dynamische erstellen von Objekten (Images, Rectangles, Circles, Cubes und Texte)
  • das Animieren von Objekte

Ist jetzt sicher etwas viel, aber gefühlt klingt es nicht unmöglich. Die Ausgabe auf einer Videokarte ist schon gelungen.
Das Rendern von Texten mit TTF gestaltet sich noch als Hindernis.
Das Gruppieren von Objekten wäre noch ein Punkt, der mich interessieren würde, aber dazu vielleicht in einem andern Thread.

Zurück zu meinem aktuellen Problem.
Siehst Du denn einen Fehler oder einen nicht 100%-OpenGL-konformen Code oder einen Ansatzpunkt?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 22, 2017 15:51 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 453
Programmiersprache: C / C++ / Lua
Naja, der Code den du da hast darf nach GL spec meines Wissens kein Alpha rendern, denn Blending ist ausgeschaltet.

Bezueglich Legacy GL Blending siehe z.B. https://www.opengl.org/archives/resourc ... arency.htm

glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

ist vermutlich was du suchst.

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


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

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

vielen Dank für Dein Feedback.

Kannst Du mir bitte noch mitteilen, an welcher Stelle ich das einfügen bzw. ändern soll?

In meinen Sourcen - die ich auch nur aus Samples und anderen Tuts zusammen gestellt habe, gibt es 3 Stellen.
Und so ganz erschließt sich mir das Enable und Disable dieser im Code noch nicht...

Ich versuch mal die englische Version zu verstehen. ;-)
LG


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

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1127
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Kannst Du mir bitte noch mitteilen, an welcher Stelle ich das einfügen bzw. ändern soll?
Bei Setup GL
Das sieht dann in etwa so aus:
Code:
  1.   glEnable(GL_BLEND);
  2.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  3.  
  4.   glEnable(GL_DEPTH_TEST);
  5.   glDepthFunc(GL_LESS);


Ich habe noch gesehen, da du
Code:
  1. glDisable(GL_BLEND);
, diese müssten noch entfernt werden.

_________________
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 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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