テクスチャを取得し、テクセルを 2 つの値の間でクランプするフラグメント プログラムを作成しようとしています。つまり、最小値が 0.2 で最大値が 0.6 の場合、0.2 未満のテクセルは 0 になり、0.6 より大きいテクセルは 1.0 になり、その間のすべての値は 0 から 1.0 にマップされます。
私の glProgramStringARB への呼び出しは、GL_INVALID_OPERATION の原因です。なぜこれが起こっているのか理解できないようです。助けてください。
シェーダーを書くのはこれが初めての試みなので、何をしているのか完全にはわかりません。これが私のコードです:
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);
それを使用するには、次のようにします。
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);