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

Aktuelle Zeit: Sa Dez 07, 2019 22:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Nov 08, 2019 14:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 217
Programmiersprache: Lazarus/FPC
Hallo,

Ein Problem bei dem ich auch nicht mehr mit Internetrecherche weiterkomme:
In meinem aktuellen Spiele-Projekt werden mehrere 3D Objekte in OpenGL gerendert und die Szene dann mit glCopyTexImage2D in eine Textur gerendert die später ausgegeben wird. Leere Bereiche sollen dabei auf der Textur transparent sein.

Das witzige an der Sache: Es funktioniert bei ungefähr der Hälfte der PCs bei denen ich es ausprobiert habe.
Immer das gleiche Programm.
Bei den anderen Geräten wird statt transparent der Rest der Textur eingeschwärzt, sprich irgendwie bekommt OpenGL nicht mit das der leere Teil der in die Textur gerenderte Szene transparent bleiben soll.
Ich nehme an hier ist irgendeine Voreinstellung bei OpenGL die am Treiber oder sonst wo gesetzt ist, nur was.
Ich hab schon viel rumprobiert mit BlendFunc und Co., komme aber nicht weiter!

Hier das Problem: Manchmal klappts, manchmal nicht
Bild

Danke im Voraus,
-ida

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 09, 2019 14:07 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 1994
Programmiersprache: C++
Hast du die Daten der getesteten PCs? Insbesondere welche Grafikkartenhersteller?
Hatte die Woche selber Probleme mit Intel. So was frustriert leider nur und lässt sich auch nur auf einem betroffenen System testen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 09, 2019 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 05, 2013 15:12
Beiträge: 135
Wohnort: Glinde
Programmiersprache: Delphi 7
So ein ähnliches Problem hatte ich auch mal.

Das ist der Grund warum ich eine Signalfarbe benutze.
Für mich wäre natürlich Interessant ob mein Spiel die gleichen Probleme auf dem PC hat.

Ich kann dir gerne meine kompletten Quellcode zeigen wenn du möchtest.

Dies sind alle Bestandteile wo ich Alpha gefunden habe:

Bei Programmstart hab ich diese alte Notiz gefunden.

Code:
  1.  
  2.   //Notiz : Wenn nicht alle Bindings wieder endbunden sind überlagern sich beim Multisampling die Alphamasken.
  3.   //          Texturen ohne Alpha nur ausserhalb binden
  4.   glDisable(GL_MULTISAMPLE_ARB);
  5.  



Code:
  1.  
  2. Procedure Textur_load(Input:PglBitmap2D;Datei:string;Alpha,Flip:boolean);
  3. begin
  4.   try
  5.     Input^:=TglBitmap2D.Create; // Instanz der Klasse erstellen
  6.     Input^.LoadFromFile(Datei); // Datei laden
  7.     if Alpha then
  8.       Input^.AddAlphaFromColorKey(255,0,255,0); //Rot,Grün,Blau,Alpha (Margenta durchsichtig)
  9.     if Flip then
  10.       Input^.FlipHorz;
  11.     Input^.GenTexture;   // geladene Textur an OpenGL übergeben
  12.   except
  13.     fehlertext('Textur konnte nicht geladen werden : '+Datei);
  14.   end;
  15. end;


Code:
  1. procedure DrawScene(Spezial:boolean);
  2. begin
  3.   with glform do
  4.   begin
  5.     glenable(GL_TEXTURE_2D);
  6.     glcolor3f(1,1,1);
  7.  
  8.     glEnable(GL_ALPHA_TEST);
  9.     glAlphaFunc(GL_Equal, 1);
  10.  
  11.     //Interface zeichnen
  12.  
  13.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  14.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  15.  
  16.     //Objekte wie Ambiente etc. zeichen
  17.  
  18.     gldisable(GL_ALPHA_TEST);
  19.  
  20.     //jetzt folgen Dinge ohne Alpha
  21.  
  22.     gldisable(GL_TEXTURE_2D);
  23.   end;
  24. end;

_________________
幸福は笑う人に来て ~~ koufuku wa warau hito ni kite
Das Glück kommt zu denen die lachen


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 10, 2019 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 217
Programmiersprache: Lazarus/FPC
Zitat:
Hast du die Daten der getesteten PCs? Insbesondere welche Grafikkartenhersteller?

Das trat tatsächlich nur bei NVIDIA Kartenauf. AMD und Intel machen hier wohl alles richtig.

Danke für die Antworten, Ich hab einen Workaround gefunden.
Kurz und prägnant: Anstatt glCopyTexImage2D lese ich die aktuelle Szene aus dem Buffer mit glReadPixel (GL_RGBA) in ein byte-Array, suche alle schwarzen Pixel und setze hier Alpha nochmal manuell auf 0, da es in meinem Falle keine halbtransparenten Pixel gibt.

Code:
  1. var
  2.   i: integer;
  3.   Data: array of array [0..3] of byte;
  4. begin
  5.   setlength(Data, width*height);
  6.  
  7.   //Hintergrund 0,0,0 schwarz!!
  8.   glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);
  9.   glClearColor(0, 0, 0, 0);
  10.  
  11.  {code draw scene}
  12.  
  13.   glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, @Data[0]);
  14.   for x := 0 to length(Data) - 1 do
  15.     if (Data[x, 0] = 0) and (Data[x, 1] = 0) and (Data[x, 2] = 0) then
  16.       Data[x, 3] := 0;          
  17.   texture:= CreateTexture(width, height, GL_RGBA, addr(Data[0])); //Methode zum erzeugen einer Textur
  18. end;


Da die Texturen nur zum Spielstart erzeugt werden müssen und sie auch noch sehr niedrig aufgelöst sind funktioniert es sehr gut! Ich kann mir jedoch vorstellen dass das bei höher aufgelösten Texturen dass lange Rechenzeiten benötigen wird!

bg

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 11, 2019 21:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2566
Wohnort: Berlin
Programmiersprache: C/C++, C#
NVidia hält Spezifikation für eine Empfehlung, bei solchen dinge hilft es zu gucken, was die OpenGL Profiler und debugger raus werfen.
Debugging Tools

In der Vergangenheit war es oft der Fall, dass man einfach bestimmte Werte nicht gesetzt hat und der Default-Wert dann bei den Treibern unterschiedlich ist oder auch nicht unterstützt werden.

_________________
"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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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