Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 18:35

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Mo Apr 16, 2012 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Apr 16, 2012 19:29 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Der Troll hat geschrieben:
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Apr 16, 2012 22:21 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Apr 17, 2012 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Apr 18, 2012 03:06 
Offline
DGL Member

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. :D

Hier nochmal der Code der beiden Shader

Code:
  1. void main()
  2. {  
  3.     gl_TexCoord[0] = gl_MultiTexCoord0;
  4.  
  5.     gl_Position = ftransform();
  6. }
  7.  


Code:
  1.  
  2. uniform sampler2D tex0,tex1;
  3.  
  4. void main()
  5. {
  6.     vec3 rgb_Values;
  7.     float alpha_Value;
  8.     vec4 Texture0 = texture2D(tex0,gl_TexCoord[0].st);
  9.     vec4 Texture1 = texture2D(tex1,gl_TexCoord[0].st);
  10.     rgb_Values = Texture0.rgb;
  11.     alpha_Value = Texture1.a;
  12.  
  13.     gl_FragColor = vec4(rgb_Values,alpha_Value);
  14. }
  15.  


tex0 ist die Standardtextur und tex1 eine reine Alpha-Textur und nimmt dementsprechend wie gefordert nur 1/4 des ursprünglichen RAMs ein.

Falls ich mal wieder ein paar Fragen habe, nerv ich entweder in diesem Thread oder nem neuen weiter. Vielleicht kann ich ja auch wem helfen.^^

Und hier noch ein paar Bilder des Ganzen:

Einmal nur die Splines, dann mit Texturen und anschließend rein gezoomt.

http://s1.directupload.net/images/120418/hhunafxs.png
http://s14.directupload.net/images/120418/mcepihxi.png
http://s14.directupload.net/images/120418/vh4ikvny.png
// edit: Bilder zu groß. ~Horazont

MfG Der Troll


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]