我想写一个片段程序,将采取纹理和钳位两个值之间的纹元。也就是说,如果最小值是0.2并且最大值是0.6,那么任何小于0.2的纹理将变为0,任何大于0.6的纹理将变为1.0,并且其间的所有值将被映射为从0到1.0。glProgramStringARB导致GL_INVALID_OPERATION ....或帮助与片段程序
我对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);
这是我的问题。我使用C#,所以我给glProgramStringARB一个UNICODE字符串,它需要一个ASCII。谢谢您的帮助! – 2008-12-11 19:12:37