0

テクスチャを取得し、テクセルを 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);
4

2 に答える 2

1

シェーダーを実際にプログラムしたことはありませんが、シェーダー コンパイラが改行を認識しないのでしょうか? 「\n\r」を入れてみましたか?

編集:

自問するかもしれないもう 1 つの質問は、使用している言語は何ですか? 文字列は UNICODE、つまり 16 ビット/文字ですか? glProgramStringARB() に渡す形式が ASCII に設定されていることに気付きました。文字列が実際に UNICODE である場合、問題が発生します。

たとえば、JAVA と C# の文字列は UNICODE です。アスキーではありません。

于 2008-12-04T10:27:04.000 に答える
0

最初: 私は ARB_fragment_program についてあまり知らないので、ここでは部分的に推測しています。

最良のオプションは、エラー文字列 (glGetString(GL_PROGRAM_ERROR_STRING_ARB)) を取得し、その内容を確認することです。

シェーダーを確認すると、3 行目と 7 行目 (おそらくそれ以上) で間違った数のコンポーネントを使用しているようです。たとえば、4 コンポーネントのベクトル (fragment.texcoord[1]) をスカラー フィールド (R0.x) に割り当てることはできないと思います。

于 2008-12-04T09:59:01.857 に答える