2017-10-12 17 views
-1

Nehmen wir an, ich habe eine einheitliche Variable in einem GLSL-Shader, welcher Wert beim Programmstart gesetzt ist. Der Wert ändert sich während der Programmausführung nie.OpenGL Uniform Variablen Persistenz

Was ich tun möchte, ist diese einheitliche Variable aus meinem Hauptprogramm C++ zu setzen.

Mein Problem ist, dass diese einheitliche Variable jedes Mal gelöscht wird, wenn ich glUseProgram aufruft. Ich muss wieder anrufen glUriformXX() API

Gibt es eine Möglichkeit, OpenGL zu sagen, nicht einheitliche Variable zwischen glUseProgram zu löschen?

+1

OpenGL löscht keine einheitlichen Werte. Sie müssen Ihren tatsächlichen Code zeigen, da es völlig unklar ist, was genau vor sich geht. – derhass

Antwort

-1

Sie können Logik & Speicherung von Daten in dieser Situation trennen wollen. In dieser Art von Situation möchten Sie möglicherweise, dass Ihre GL-Daten, die von der C++ - Anwendung initialisiert werden, an OpenGL & GLSL über ihre API-Aufrufe getrennt von Ihren logischen Aufrufen übergeben werden. Dann ist es sehr praktisch, eine Struktur oder Klasse eines Datenbanktyps zu haben, die alle Instanzen Ihrer Programme, Shader, Uniformen und Variablen im Auge behält.

Ihre Haupt-Engine-Klasse oder -Struktur wäre verantwortlich für die Einrichtung Ihrer Windows, Ihrer grundlegenden I/O, Einrichten eines OpenGL-Kontexts, Erstellen Ihrer Programme & Shadern und die Aufrufe an den Renderer oder Grafikkarte übergeben. Ihre Anwendungslogik sollte auch davon getrennt sein. Eine weitere nette Funktion bei diesem Ansatz, Ihre Datenstrukturen voneinander zu trennen, wäre, sie als Teil Ihrer Engine zu haben, die auf empfangenen Eingabedaten von der spezifischen Anwendung durch ihren Initialisierungsprozess beruht.

Mit einem Manager Typ-Klasse zu pflegen und verfolgen Sie alle Ihre Instanzen für jedes Programm, Shader & seine Daten können Sie eine kostengünstige Einzelinstanz aller Ihrer Uniformen als const Typen in Containern und Variablentypen bleiben für ihre Lebensdauer und dann werden nach Gebrauch verworfen, wo neue erstellt werden, wenn sie benötigt werden. Auf diese Weise, wenn Sie & deaktivieren Sie Ihre Programme, die & zerstören ihre internen Datensätze, haben Sie immer noch Zugriff auf vorhandene Daten, die Sie leicht abrufen und neu initialisieren können, solange Sie diese Art von Verwaltungsklasse in einem Cache freundliche Weise. Dies hängt auch davon ab, zu wissen, welche Art von Daten als Stapelvariablen oder welche als dynamischen Speicher zu haben haben. Die Verwendung von Vorlagen kann hier zusammen mit intelligenten Zeigern wie std::shared_ptr<T> & std::unique_ptr<T> sehr nützlich sein. Der Grund, warum ich hier Smartpointer erwähnt habe, ist, dass es das Aufräumen einfacher macht, es hilft, das Eigentum zu verwalten, und Sie können einfach beide Uniformen & von einem einzigen Container aus speichern, erstellen, versenden und entfernen. Diese Art von Konstrukt ist jedoch ziemlich komplex und liegt außerhalb des Rahmens, diese Frage vollständig zu beantworten, da es zu viele integrierte Teile eines Spiels oder einer 3D-Grafik-Engine gibt, die hier angezeigt werden.