glProgramLocalParameter --> glUniform
-
Hi leute,
ich versuche gerade einen shader in GLSL zu übersetzen und hänge an folgender Stelle.Der Shader hat bisher Zugriff auf die Bone Translation via
"PARAM matrix[87] = { program.local[0..86] };\n"\
und wird momentan so gefüttert.
glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,boneId*3,&transformation[0]); glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,boneId*3+1,&transformation[4]); glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,boneId*3+2,&transformation[8]);
(MaxBones sind 29, also insgesamt 87 felder)
Dies will ich jetzt übersetzen. Da ich im Zusammenhang mit GLSL nichts zu Parametern gefunden habe habe ich mich mal dazu entschieden zu schaun ob ich es mit Uniforms hinbekomme.
Jetzt steh ich vor dem Problem nicht zu wissen wie ich dies übersetzen soll. Ich habe das halbe internet durchforstet und selbst in dem Buch "OpenGL Shading Language" nichts finden können.
Ich dachte mir das ich wohl über Uniforms rangehen muss aber leider komme ich zu keinem Erfolg.Mein bisheriges etwas sieht ca. so aus.
Vshader:
uniform vec4 BoneMatrix[87];
OnRender:
for(all_Bones){ float transformation[12]; transformation = ...; ... char buffer [25]; sprintf (buffer, "BoneMatrix[%i]", boneId*3); GLint MatrixLoc = glGetUniformLocationARB(p,buffer); glUniform4fvARB(MatrixLoc, 3, transformation); ... }
ich glaube das ist soweit garnicht gravierend falsch, jeddoch weiss ich nicht wie genau ich jetzt die tatsächliche Uniform übergebe.
Wäre echt nice wenn mir jemand ein bisschen weiterhelfen könnte.
Mfg
-
Bittschön. Das Tutorial auf der Seite ist echt klasse.
Warum verwendest du kein OpenGL 2.0?
/edit: Huch, du scheinst da komische Sachen zu machen. Du kannst keine Einzelteile des uniforms setzen, nur das gesamte Array!
-
Hi,
das Tutorial kenn ich natürlich schon. Trotzdem dankeIch hab das bisher mal bei ARB belassen damit das VP weiterhin noch funktioniert.
Was so der genaue Unterschied ist, ist mir eh net genau klarAuf den ersten Blick muss man ja einfach nur das ARB weglassen
Bist du sicher das ich die Uniforms in einem Aufwasch setzen muss? glGetUniformLocation findet immer ne Location für den Array, es scheint da keine Probleme zu geben. Sieht so aus als ob man auch gezielt auf die Arrayfeldere zugreifen kann, ich meine ich habe das sogar schon in Beispielen gesehen.
edit:
ich hab nun den array erst komplett gebaut und ihn dann erst am Ende mitglUniform4fv(MatrixLoc, 29, &trans[0]);
gesetzt, was aber genau das gleiche (soweit man das erkennen kann) Resultat ergibt.
-
Habs nu gepackt, der Fehler lag in der Shader Übersetzung selbst, hatte nen tükischen Zahlendreher.
Der Code für die Uniforms funktioniert genau wie vermutet, auch durch Stückchenweises setzen der Arrayfelder.