mein Vorhaben in Kürze (Achtung, ich benutze WebGL): In der Applikation hat der Benutzer die Möglichkeit eine boolean-Variable zu setzen, um entweder die Farbe des Objektes mit einer Uniform-Variable zu setzen (konstante Farbangabe) oder die Farbangabe pro Vertex anzugeben. Letzteres führt natürlich dazu, dass er einen VBO für die Farbinformationen verwenden muss. Im untenstehenden Code des Vertex-Shaders wird dies durch die boolean-Variable useUniformColor geregelt. Allerdings macht die if-abfrage bzw. dessen Inhalt richtig Probleme. Sobald die if-Abfrage im Code erscheint, funktioniert das ganze Programm (in Chromium) nicht mehr, d.h. die Objekte werden nicht mehr mit dem Wert der Uniform-Farb-Variable gefärbt. In Firefox ist das Ganze kein Ding, es funktioniert, wie gewollt, halt nur nicht in Chromium (9.0.564.0 (63713)). Zwei blöde Dinge sind zu beobachten: 1. Auch wenn ich z.B. die dauerhafte false-Variable "test" in das if-Statement einsetze (siehe auskommentierte Zeile), so blockiert diese Abfrage das ganze Programm, obwohl die Variable ja immer false ist und der if-Block niemals betreten werden dürfte. 2. Der Hauptblockator ist scheinbar diese Zeile: myColor=vertexColor; Auch wenn ich so etwas (sehr) Merkwürdiges wie
angebe, stoppt die Einfärbung der Objekte mit konstanter Farbe.
Leider bekomme ich keinerlei Fehlermeldungen oder Hinweise vom Chromium-Browser. Deshalb frage ich hier einfach mal nach. Vielleicht habt ihr ja eine Idee, warum die Implementierung ein solches Verhalten zeigt.
Bevor ihr fragt, hier die Initialisierung bzw. Referenzspeicherung der Variablen des Shaders:
Im Programm aktiviere ich das Farbattribut mit gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute); und verwende dann das Farb-VBO. Die entsprechenden Objekte werden mit den angegebenen Farben eingefärbt, allerdings kommen dann die oben beschriebenen Probleme, also das "blockieren" der Uniform-Farbe anderer Objekte.
Wisst ihr was los ist? Vielleicht vergesse ich etwas (bin ein Anfänger) ..
angebe, stoppt die Einfärbung der Objekte mit konstanter Farbe.
Klar, weil der else-Zweig fehlt?
Das war mit Absicht gemacht, um das Merkwürdige zu demonstrieren, denn: Die konstante Färbung geschieht ja außerhalb der if-Abfrage mit myColor=constantColor; , d.h. es müsste immer gelten. Aber es geht ja eben nicht, weiß der Geier warum nicht. Er stoppt ,nur weil ich die eigentlich wertlose if-Abfrage reingebaut habe.
Zitat:
Ansonsten wäre ggf. noch interessant wie du die Uniform-Variable setzt.
gl.uniform1i(shaderProgram.useUniformColor,true); gl.uniform3f(shaderProgram.constantColor,1.0,1.0,1.0); //hier nur z.B. Weiß
Versuch mal statt "true" eine 1. Vielleicht testet der Shader statt auf >0 nur auf == 1. Was besseres fällt mir nicht ein.
Edit: Könnte es am "precision highp float;" liegen?
Edit2: Ok, vergiss es :
Zitat:
The fragment language has no default precision qualifier for floating point types. Hence for float, floating point vector and matrix variable declarations, either the declaration must include a precision qualifier or the default float precision must have been previously declared.
Versuch mal statt "true" eine 1. Vielleicht testet der Shader statt auf >0 nur auf == 1. Was besseres fällt mir nicht ein.
Habe ich soeben versucht, es hilft leider auch nicht. Es ist eher ein Problem des Wechsels von Shader-Attribut-Variablen zu Shader-Uniform-Variablen. Egal wo das myColor=vertexColor im Code und egal mit welchen Bedingungen es umrundet ist: Es blockiert die Färbung aller nachfolgenden Objekte, die mit myColor=constantColor gefärbt werden sollen.
Hä?? WebGl bzw. GLSL ist schon eine sehr komische Stange... -------
Ich hab mal den Code sehr stark komprimiert und poste ihn mal hier. Auch habe ich erstmal die Färbung mit einer Attribute-Variable wegelassen und nur noch das if-Statement dargelassen (siehe vertex shader). Sobald ich den if-else-Block wegnehme, funktioniert es wieder in Chromium, allerdings dann nur die konstante Uniform-Färbung:
//------------------Globale Variablen----------------- var zoom =1; var xTrans=0 ; var yTrans=0;
//-----------------------------Central Model Collector--------------------------- var allModels=new glCentral(); function initZentraleEinheit(v){ allModels.setInitialTranslation(-(v[0]),-(v[1]),-(v[2])) allModels.additionalTranslation=[0,0,0]; allModels.selectModus=false; //erst bei buttonklick aktivieren }
//----------------------------AJAX- Request---------------------- var req; function loadJSON(){ req = new XMLHttpRequest(); req.open("GET", "interleaved.json"); req.send(null); req.onreadystatechange = loadModels;
}
//---------------------load Models----------------------- var m; function loadModels(){ if (req.readyState == 4){ m = eval('(' + req.responseText + ')');
for(var k=0;k<m.modelle.length;k++){ var name=m.modelle[k].name; var vertices=m.modelle[k].vertices; var color=m.modelle[k].color; var type=m.modelle[k].type; zvalue=m.diagonal;
var zvalue; function drawModels(){ gl.uniform3f(shaderProgram.ambientLight,0.3,0.3,0.3); allModels.translation=[xTrans,yTrans,-zvalue] var ausgabe=" "; for(var i=0;i<allModels.models.length;i++){ allModels.models[i].draw(); } }
var select=true; var canvas; function webGLStart() { canvas = document.getElementById("canvas"); initGL(canvas); initShaders(); //initFBO(); loadJSON(); gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clearDepth(1.0); gl.enable(gl.DEPTH_TEST); gl.depthFunc(gl.LEQUAL); //gl.lineWidth(3.0); // drawScene(); }
Lass dir mal das Info-Log vom compilieren und linken der Shader ausgeben. Auch wenn der Status erfolgreich ist, kann es Warnungen geben die sinnvolle Hinweise geben können.
Ein Hinweis nebenbei der mit der Sache nichts zu tun hat...
Normalen transformiert man anders. Man nimmt den Rotationsteil der ModelView-Matrix (3x3, oben links) und invertiert diesen und transponiert ihn nochmal. Du kannst auch die 4x4 Matrix invertieren, aber der Aufwand ist wesentlich größer als für eine 3x3 Matrix. In jedem Fall darfst du die Normale aber nicht mit w=1.0 ergänzen, da es ja eine Richtung ist und kein Punkt. => 3x3 Matrix benutzt oder mit 0.0 ergänzen. Darüber hinaus sollte die Normale nach der Multiplikation mit der NormalMatrix normalisiert werden.
Zitat:
Hä?? WebGl bzw. GLSL ist schon eine sehr komische Stange...
GLSL ist eigentlich sehr schön. Wenn es im anderen Browser geht ist es wohl eher Chromium was hier strange ist
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.