Vielen Dank erstmal, für die Infos. Ich mache das ein und ausschalten von Shadern nun momentan mit glDetachShader(). Allerdings muss ich das Programm dann neu Linken und aktivieren, andernfalls übernimmt er die Änderungen nicht. Ist das soweit korrekt? Bzw meinte ja wer, dass ich besser zwei Shader Programme generiere und zwischen denen hin und her switche.
Den Shader switch machst du mit glUseProgram. Einfach immer das gewünschte Programm-Objekt "usen"...oder glUseProgram(0) um die alte feste Pipeline zu benutzen.
Vielen Dank erstmal, für die Infos. Ich mache das ein und ausschalten von Shadern nun momentan mit glDetachShader(). Allerdings muss ich das Programm dann neu Linken und aktivieren, andernfalls übernimmt er die Änderungen nicht. Ist das soweit korrekt? Bzw meinte ja wer, dass ich besser zwei Shader Programme generiere und zwischen denen hin und her switche.
Ich brauche den Shader ja momentan nur für die Übergangselemente zwischen Luft und Boden (Auch wenn ich denke, dass ich später wohl doch etwas mehr damit rum spielen werde, das bietet ja doch einige Möglichkeiten). Dementsprechend würde ich ihn für alle anderen Zwecke einfach abschalten. Gibt es einen Befehl, womit ich OpenGL sage einfach gar keinen Shader zu verwenden oder muss ich mir ein "Standard"-Shader mit meinen Standardeinstellungen generieren?
Ansonsten versuche ich einfach mal den Shader den ich haben will zu proggen und Poste dann mal den Quellcode hier, damit ihr euch dann über das schlechte Coding auslassen könnt^^.
MfG Der Troll
Jop das gibt es glUseProgram(0) dann sind keine Shader mehr aktiv.
Du brauchst nicht jedesmal DetachShader zu machen ^^
Hab dir mal meine GLSL Shader Klasse mit dazu gepackt. Kannst wenn du willst, verwenden, modifizieren, machen was de willst damit ^^ Benutzung ist ziemlich einfach, nachdem OpenGL initialisiert wurde instanz erzeugen, Shader hinzuladen, beim rendern aktivieren und nachdem rendern deaktivieren:
Kann sein das du die klasse anpassen musst, wenn du nicht glew verwendest.
CGLSL* myshader = new CGLSL(); myshader->AttachShader(GL_VERTEX_SHADER, "vertex shader source als const char*"); myshader->AttachShader(GL_FRAGMENT_SHADER, "fragment shader source als const char*");
vor dem zerstören von OpenGL: delete myshader;
und beim rendern ist es genauso simpel:
// Shader an myshader->Enable();
// Optional shader uniforms/properties setzten: sampler2D texture0 an Texture Unit 0 binden (Das solltest du immer tun wenn du texturen verwendest im shader) myshader->Uniform1i(myshader->GetUniformLocation("texture1"), 0);
// render mit aktiviertem shader
// Shader ausmachen myshader->Disable();
Have phun.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Sa Apr 14, 2012 14:28 Beiträge: 52
Programmiersprache: c++
Ich glaube ich wiederhole mich, aber danke Leute! Mein Kopf füllt sich gerade mit kranken Ideen, die ich mit Shadern umsetzen kann^^ Ich begreif nun auch die von Coolcat anfangs genannte Möglichkeit, solide und nicht solide Stellen on the fly berechnen zu lassen. (Muss gestehen, am Anfang hat es mich ein wenig übermannt, hauptsächlich aus Unkenntnis). Der Pixel muss von der GPU ja eh berechnet werden und ob ich da jetzt noch ein paar Anweisungen mehr rein drücke kümmert diese herzlich wenig. Ich muss halt mal schauen, wieviel so einer on-the-fly Berechnung die Grafikkarte noch ab kann. Letztendlich gilt es für mich halt ein gutes Gleichgewicht zwischen RAM-, GPU- und Prozessor-Auslastung zu finden. Wenn es die Frame-Rate zu sehr drückt, nehme ich halt den RAM, dafür ist er ja da und 500Mb... sollte keinen mehr kümmern^^ Allerdings stellt sich mir da doch noch folgende Frage: Was belastet die GPU mehr, ein paar 100 Schleifendurchläufe zur Bestimmung ob solide oder nicht, oder das Binden einer Textur, denn für jedes Raster, welches Splines enthält, würde ich ja momentan zumindest eine Alpha-Textur neu binden müssen.
Arg... Fragen über Fragen...
MfG Der Troll
@Finalspace: Vielen Dank, habe mir mal die Datei gesaugt und werde die Tage mal rein schauen. Da ich aber der DIY-Typ bin, werde ich mir vermutlich ne eigene Klasse anlegen. Ich habe mich ja schon sehr schwer damit getan, Glew zu verwenden xD (weil ich ungern Code nehme, den ich nicht selbst geschrieben habe^^) Ich weiß, dass das bescheuert ist, aber durch das selber Coden habe ich schon so viel gelernt, auch bezüglich Bildbearbeitung. Hätte ich mir keinen eigenen Bitmap-Loader geschrieben, wären mir einige Dinge im nachhinein wesentlich schwerer gefallen, besonders das Ummünzen der Splines in Alpha-Werte.
Allerdings stellt sich mir da doch noch folgende Frage: Was belastet die GPU mehr, ein paar 100 Schleifendurchläufe zur Bestimmung ob solide oder nicht, oder das Binden einer Textur, denn für jedes Raster, welches Splines enthält, würde ich ja momentan zumindest eine Alpha-Textur neu binden müssen.
Der wesentliche limitierende Faktor bei Shadern sind immer Zugriffe auf den Speicher (Texturen, Vertexdaten). Berechnungen kosten natürlich auch Zeit, sind aber im Vergleich eher Nebensache. Das erstellen der Alpha-Textur auf der CPU dürfte deutlich langsamer sein, da die CPU langsamer ist und außerdem die Daten noch zur Grafikkarte übertragen werden müssen. Wahrscheinlich ist das erstellen der Alpha-Textur trotzdem schneller, einfach aus dem Grund weil diese ja nur erstellen musst wenn sie sich ändert. Wenn sich die Textur aber häufig ändert, wird sich das on-the-fly Berechnen immer mehr lohnen.
Was du natürlich auch machen kannst ist die Alpha-Textur auf der Grafikkarte zu berechnen. Statt auf den Bildschirm kannst du nämlich auch in eine Textur rendern. Aber da du gerade noch beim Verdauen des Shader-Schocks bist....solltest du dir nicht auch noch gleichzeitig die FBO's antun. Falls du dir das irgendwann später mal anschauen möchtest, hier ein Link dazu: FBO.
Registriert: Sa Apr 14, 2012 14:28 Beiträge: 52
Programmiersprache: c++
So, die Shader funktionieren nun wie sie sollen. Super Sache, danke nochmal an alle! Hier hat sich mir eine völlig neue und großartige Welt eröffnet. Mal gucken wo die Reise so hin geht.
Mitglieder in diesem Forum: Google [Bot] und 2 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.