GLProgramstringarb verursacht GL_invalid_operation… oder Hilfe bei Fragmentprogrammen

StackOverflow https://stackoverflow.com/questions/339042

  •  19-08-2019
  •  | 
  •  

Frage

Ich versuche ein Fragmentprogramm zu schreiben, das eine Textur aufnimmt und die Texels zwischen zwei Werten klemmt. Das heißt, wenn der min -Wert beispielsweise 0,2 und der maximale Wert von 0,6 beträgt, wird jeder Texel weniger als 0,2 0, jeder Texel über 0,6 wird 1,0 und alle Werte dazwischen werden von 0 auf 1,0 abgebildet.

Mein Aufruf an GLProgramstringarb ist eine GL_invalid_operation. Ich kann nicht herausfinden, warum das passiert. Bitte helfen Sie.

Dies ist mein erster Versuch, einen Shader zu schreiben, daher bin ich mir nicht ganz sicher, was ich tue. Hier ist mein Code:

String str = 
   "!!ARBfp1.0\n"+            
   "TEMP R0;\n"+
   "MOV R0.x, fragment.texcoord[1];\n"+
   "ADD R0.w, fragment.texcoord[2].x, -R0.x;\n"+
   "TEX R0.xyz, fragment.texcoord[0], texture[0], 2D;\n"+
   "RCP R0.w, R0.w;\n"+
   "ADD R0.xyz, R0, -fragment.texcoord[1].x;\n"+
   "MUL_SAT result.color.xyz, R0, R0.w;\n"+
   "END\n";

int count = str.Length;

Gl.glEnable(Gl.GL_FRAGMENT_PROGRAM_ARB);
Gl.glGenProgramsARB(1, out mFragProg);            
Gl.glBindProgramARB(Gl.GL_FRAGMENT_PROGRAM_ARB, mFragProg);
Gl.glProgramStringARB(Gl.GL_FRAGMENT_PROGRAM_ARB,  Gl.GL_PROGRAM_FORMAT_ASCII_ARB, count, str);
GetGLError("glProgramStringARB");
Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);

Dann, um es zu verwenden, mache ich Folgendes:

Gl.glEnable(Gl.GL_FRAGMENT_PROGRAM_ARB);
Gl.glBindProgramARB(Gl.GL_FRAGMENT_PROGRAM_ARB, mFragProg);
float max = (mMiddle + (mRange / 2.0f))/65535.0f;
float min = (mMiddle - (mRange / 2.0f))/65535.0f;
Gl.glMultiTexCoord1f(Gl.GL_TEXTURE1_ARB, min);
Gl.glMultiTexCoord1f(Gl.GL_TEXTURE2_ARB, max);
GetGLError("Enable Program for Drawing");

/* 
 * Drawing Code
 */

Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);
War es hilfreich?

Lösung

Ich habe keine Shader wirklich programmiert, aber vielleicht erkennt der Shader -Compiler die neue Linie nicht? Haben Sie versucht, " n r" zu platzieren?

BEARBEITEN:

Eine andere Frage, die Sie sich stellen könnten, ist, welche Sprache Sie verwenden? Sind Saiten in Unicode, dh 16-bit/char? Mir ist gerade aufgefallen, dass das Format, das Sie in den GLProgramstringarb () übergeben, auf ASCII eingestellt ist. Wenn die Zeichenfolge wirklich unicode ist, wird dies zu Problemen führen.

Zum Beispiel sind Java- und C# -Schaden in Unicode. nicht ASCII.

Andere Tipps

Erstens: Ich weiß nicht viel über Arb_Fragment_Program, also rate ich hier teilweise.

Ihre beste Option ist es, die Fehlerzeichenfolge (GlgetString (GL_PROGRAM_ERROR_STRING_ARB)) zu erhalten und zu sehen, was Ihnen das sagt.

Nachdem Sie sich den Shader angesehen haben, verwenden Sie die falsche Anzahl von Komponenten in den Zeilen 3 und 7 (und wahrscheinlich mehr). Zum Beispiel glaube ich nicht, dass Sie einem skalaren Feld (r0.x) einen 4-Komponenten-Vektor (Fragment.TexCoord [1]) zuweisen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top