OpenGl und CG-Shader
-
Hey!
Ich habe ein Problem, was mich derzeit zur verzweiflung bringt:
Wie kann man unterschiedliche Shader an jeweils unterschiedliche Meshes binden?
Mein derzeitger Versuch sieht in etwa folgender Maßen aus:
cgGLEnableProfile( vertexProfile ); cgGLEnableProfile( fragmentProfile ); cgGLBindProgram( vertexProg1 ); cgGLBindProgram( fragmentProg1 ); drawCube(); cgGLBindProgram( vertexProg2 ); cgGLBindProgram( fragmentProg2 ); drawSphere(); cgGLDisableProfile( vertexProfile ); cgGLDisableProfile( fragmentProfile );
Habe es auch bereits mit einem "Unbind" nach den jeweiligen Objekten probiert - leider auch erfolglos!
Hätte jemand ein paar Tipps für mich?
-
Tipp 1: Problembeschreibung
-
Sorry, dachte man würde mich verstehen
Dann versuche ich es nochmal anders:
Ich hab 2 geometrische Figuren - ein Würfel und eine Kugel.
Der Würfel soll bspw. ein Diffuse-Light-Shader-Programm ( bestehend aus 1 Vertex-Shader und 1 Fragment-Shader ) bekommen und die Kugel ein Specular-Light-Shader ( ebenfalls bestehend aus 1 Vertex-Shader und 1 Fragment-Shader ).
Alle Programme werden zum Start initialisiert und nach obenstehenden Schema gebunden. Funktioniert so leider nicht
Die Fragment-Shadern scheinen soweit richtig zu funktionieren, allerdings wird komischerweise die Kugel auf den Würfel positioniert und übernimmt auch daren Scale-Faktor.
Jemand ein paar Ideen?
-
Tipp 2: Parameter setzen!
-
Der Code oben war mehr oder weniger nur als Beispiel meiner Code-Struktur zu sehen. Parameter sind natürlich gesetzt und jeder Shader funktioniert für sich allein auch perfekt.
Es geht mir nur darum, das die beiden Geometrien jeweils unterschiedliche Shader bekommen.
Ist der Code an sich richtig, sprich sollte ich den Fehler woanders suchen?
-
Also machst du das so?
cgGLEnableProfile( vertexProfile ); cgGLEnableProfile( fragmentProfile ); cgGLBindProgram( vertexProg1 ); cgGLBindProgram( fragmentProg1 ); //Parameter setzen drawCube(); cgGLBindProgram( vertexProg2 ); cgGLBindProgram( fragmentProg2 ); //Parameter setzen drawSphere(); cgGLDisableProfile( vertexProfile ); cgGLDisableProfile( fragmentProfile );
-
Ja genau, ist etwas schwierig mein Code hier genau zu posten, da ich die ganze Sache etwas mehr abstrahiert habe.
Aber würdest du sagen, dass es so funktionieren "müsste"?
Denn dann muss ich den Fehler wohl woanders suchen.
-
epTical schrieb:
Aber würdest du sagen, dass es so funktionieren "müsste"?
Bin kein cg Experte, da ich eher glsl und hlsl nutze, aber ja, an sich sollte das so gehen.
Jedoch klingtDie Fragment-Shadern scheinen soweit richtig zu funktionieren, allerdings wird komischerweise die Kugel auf den Würfel positioniert und übernimmt auch daren Scale-Faktor.
danach, als ob du eben nicht jedesmal die Parameter setzt, oder du setzt beide male dieselben Parameter, schau es dir im debugger an.
-
Alles klar, danke
So hab ich wenigstens ersteinmal wieder einen Anhaltspunkt.
Melde mich soweit, sobald ich was genaueres weiß.
-
Oh Gott, hab den Fehler gefunden. Vielen Dank nochmal! Ohne dich hätte ich immernoch probiert die Shader richtig zu binden
Der Fehler lag an einem Buchstabendreher der Entry-Funktion für den 2. Vertex-Shader