2010-11-06 7 views
5

Ich schreibe ein OpenGL-Programm, das in einen Hilfspuffer zeichnet, dann wird der Inhalt des Hilfspuffers zum Akkumulationspuffer akkumuliert, bevor er in den Back-Puffer GL_RETURN-ediert wird (im Wesentlichen zum Bildschirm zusammengesetzt werden soll). Kurz gesagt, mache ich eine Art Bewegungsunschärfe. Aber das seltsame ist, wenn ich mein Programm neu kompiliere und erneut durchführe, sah ich den Inhalt des Hilfs-/Akkumulationspuffers aus dem vorherigen Programm. Das macht keinen Sinn. Habe ich etwas falsch verstanden, sollte der OpenGL-Zustand beim Neustart des Programms nicht komplett zurückgesetzt werden?Wie konnte der Status von OpenGL-Puffern zwischen Programmläufen beibehalten werden?

Ich bin ein SDL/OpenGL-Programm in Gentoo Linux nVidia Treiber 195.36.31 auf GeForce Go 6150. Schreiben

Antwort

10

Nein - es gibt keinen Grund für die GPU immer klar seine Erinnerung. Es liegt in Ihrer Verantwortung, Ihre Texturen zu löschen (oder zu initialisieren), bevor Sie sie verwenden.

+0

Danke, zumindest jetzt weiß ich, dass es kein unerwartetes Verhalten ist, obwohl es nur gruselig ist ... –

+1

stimme ich zu. Möchte hinzufügen: unter bestimmten Bedingungen werden Videotreiber aufgefordert, den zugewiesenen Speicher aufgrund von "Sicherheits" -Überlegungen auf Null zu setzen (das bösartige Programm möchte vielleicht wissen, was andere gezeichnet haben). Das ist lächerlich (ich würde sagen, das sollte die Verantwortung dieses Programms sein, das seine Zwischenergebnisse verbergen will), aber so ist es jetzt. – valdo

+1

Ich habe eine Menge Direct3D durch die DirectX9-Ära gemacht. Wenn ich anfing, wurden Framebuffer, Oberflächen usw. uninitialisiert, und Code konnte den Inhalt eines vorherigen Laufs leicht aussetzen. Irgendwann müssen entweder Microsoft oder die Treiberanbieter entschieden haben, dies zu "reparieren", und Sie würden statt dessen gepufferte Puffer bekommen. Ich glaube, es wurde im Namen der Sicherheit getan. Ich würde sagen, die Sicherheitsbedenken sind gültig; wir würden ein System nicht tolerieren, das den Arbeitsablauf des Benutzers übergibt, der die ungereinigten Trümmer anderer Benutzer enthält, und der Framebuffer-RAM sollte nicht anders betrachtet werden. – timday

5

Tatsächlich wird der OpenGL-Status mit wohldefinierten Werten initialisiert.

Der GL-Status besteht jedoch aus Einstellungen wie alle binären Schalter (glEnable), Blending, Tiefentestmodus ... etc, usw. Jeder von diesen hat seine Standardeinstellungen, die in OpenGL specs beschrieben werden, und Sie können sicher sein dass sie bei der Kontexterstellung erzwungen werden.

Der Punkt ist, der Framebuffer (oder Texturdaten oder Vertex-Puffer oder irgendetwas) ist kein Teil von dem, was "GL Zustand" genannt wird. GL-Status "existiert" in Ihrem Treiber. Was im GPU-Speicher gespeichert ist, ist eine völlig andere Sache und wird nicht initialisiert, bis Sie den Treiber (über GL-Aufrufe) bitten, ihn zu initialisieren. Es ist also durchaus möglich, die Überbleibsel der vorherigen Ausführung im Texturspeicher oder sogar im Bildpuffer selbst zu haben, wenn Sie sie beim Start nicht löschen oder initialisieren.