我正在尝试编写一个片段程序,它将采用纹理并在两个值之间夹住纹素。也就是说,如果最小值为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);
答案 0 :(得分:1)
我还没有真正编写过任何着色器,但也许着色器编译器无法识别新行?你试过放“\ n \ r”吗?
编辑:
您可能会问自己的另一个问题是您使用的语言是什么?是UNICODE中的字符串,即16位/字符?我刚刚注意到你传入glProgramStringARB()的格式设置为ASCII。如果字符串确实是UNICODE,那么它将导致问题。
例如,JAVA和C#字符串位于UNICODE中。不是ASCII。
答案 1 :(得分:0)
首先:我对ARB_fragment_program了解不多,所以我在这里猜测一下。
您最好的选择是获取错误字符串(glGetString(GL_PROGRAM_ERROR_STRING_ARB))并查看它告诉您的内容。
在查看着色器之后,您似乎在第3行和第7行中使用了错误数量的组件(可能还有更多)。例如,我认为您不能将4分量向量(fragment.texcoord [1])分配给标量字段(R0.x)。