2008-12-03 90 views
0

我想写一个片段程序,将采取纹理和钳位两个值之间的纹元。也就是说,如果最小值是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); 

回答

1

我还没有真正编写任何着色器,但也许着色器编译器不能识别新行?你试过把“\ n \ r”放进去吗?

编辑:

,你可能会问自己是你使用的是什么语言的另一个问题? UNICODE字符串,即16位/字符?我只注意到你传递给glProgramStringARB()的格式被设置为ASCII。如果字符串确实是UNICODE,那么它会导致问题。

例如,JAVA和C#字符串在UNICODE中。不是ASCII。

+0

这是我的问题。我使用C#,所以我给glProgramStringARB一个UNICODE字符串,它需要一个ASCII。谢谢您的帮助! – 2008-12-11 19:12:37

0

第一:我不知道很多关于ARB_fragment_program所以我猜一部分在这里。

你最好的选择是获取错误字符串(glGetString(GL_PROGRAM_ERROR_STRING_ARB)),看看有什么告诉你。

看了着色器后,您似乎在第3行和第7行中使用了错误的组件数量(可能还有更多)。例如,我不认为您可以将4分量矢量(fragment.texcoord [1])分配给标量字段(R0.x)。