Registriert: Mi Apr 13, 2011 22:05 Beiträge: 218
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
Danke im Voraus, -ida
_________________ Ich teile manchmal heimlich durch Null. - Alber Einstein
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2067
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.
Registriert: Mi Apr 13, 2011 22:05 Beiträge: 218
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:
var
i: integer;
Data: array of array [0..3] of byte;
begin
setlength(Data, width*height);
//Hintergrund 0,0,0 schwarz!!
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);
if (Data[x, 0] = 0) and (Data[x, 1] = 0) and (Data[x, 2] = 0) then
Data[x, 3] := 0;
texture:= CreateTexture(width, height, GL_RGBA, addr(Data[0])); //Methode zum erzeugen einer Textur
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
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2622 Wohnort: Berlin
Programmiersprache: Go, 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
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.