Verwaltung mehrerer Shader (openGL)
-
Hallo,
ich befinde mich an den Anfängen der Anfänge von "3D Programmierung" (wenn man so sagen darf) und schaufel mich langsam durch die Unmengen Stoff hindurch.
Viel konnte mir bisher die Reference oder die zugehörige Wiki erklären, bei einem bin ich mir nicht sicher:Erstelle ich einen (Vertex-, Fragment-) Shader wie folgt:
shader = glCreateShader(...);
dann wird schlussendlich Speicher in der GPU reserviert? Oder noch im RAM?
Im Grunde ist die Frage: Ab wann befinde ich mich mit meinen Shader-Objekten in der GPU? Gleich bei
glCreateShader
oder erst nach dem linken des Programms (nach Attachen, etc.)
Denn, ich überlege, wie ich es verwalte, wenn ich mehrere Shader verwenden möchte; lasse ich die Objekte kompiliert liegen, oder lasse ich gar gelinkte Programme liegen, welches mir aber beides unwohl erscheint, wenn ich damit die GPU vollmülle.
Oder ist das ein "je nach dem" ?Lieben Gruß,
ghub
-
Ein shader ist erstma nur ein teil eine GPU-Programms (wie nen modul bei C/C++) und leigt erstma nur im Ram rum. Du müsstes erstam glCreateProgram aufrufen um ein lauffähiges GPU program zu bekommen (linken). Aber selbst dann ist das Program noch nich auf der GPU, meines Wissens nach passiert das erts mit glUseProgram.
-
Sobald du deinen Shader erstellst, ist er auch auf der Grafikkarte.
Per Attach werden dann die Funktionen zum Shader hinzugefügt, welche du eben bestimmst.... bzw. dann durchs Linken wohl eher.Der Shader liegt dann schon auf der Grafikkarte, wird aber erst per glUseProgram aktiviert und in die Pipeline eingebunden.
-
Okay, vielen Dank.
Wenn ich nun mehrere Shader-Programme verwenden möchte (innerhalb einer Frame), dann habe ich diese aber schon gelinkt und verwende nur noch glUseProgram()?
-
Wie genau meinst du das? Du linkest jeweils einen Vertex und einen Fragment Shader zu einem Program. Das aktive Program setzt du mit glUseProgram(). Alles was du von dort weg renderst, wird mit diesem Program gemalt. Willst du mit einem anderen Program rendern, musst du eben wieder glUseProgram() aufrufen...
-
Das schon, nur wenn ich pro gerendertes Bild, sagen wir drei solcher Programme habe, wie macht dann das am besten?
Linke ich die bei der Initialisierung schon und beim zeichnen der einzelnen Frames rufe ich dann nur noch "glUseProgram" auf?
Oder kompiliere und linke ich jedes Mal neu?
-
Du kompilierst und linkest die natürlich idealerweise genau einmal zur Ladezeit des Programmes.
-
Ah! Okay. Vielen Dank.
Tut mir leid, wenn ich mich etwas unverständlich ausgedrückt habe.