我正在尝试编写一个片段程序,该程序将采用纹理,并将Texels夹在两个值之间。也就是说,如果最小值为0.2并且最大值为0.6,则任何小于0.2的texel将变为0,任何大于0.6的texel将变为1.0,并且两次之间的所有值将映射从0到1.0。

我对GLPROGRAMSTRINGARB的呼吁是GL_INVALID_OPERATY。我似乎无法弄清楚为什么会发生这种情况。请帮忙。

这是我第一次编写着着色器的尝试,因此我不确定自己在做什么。这是我的代码:

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);
有帮助吗?

解决方案

我还没有真正编程过任何着色器,但是阴暗器编译器也许不认识新系列?您是否尝试过将“ n r”放置?

编辑:

您可能会问自己的另一个问题是您正在使用哪种语言?字符串是Unicode,即16位/char吗?我只是注意到您传递到GlProgramStringarb()的格式设置为ASCII。如果字符串确实是Unicode,则会引起问题。

例如,Java和C#字符串在Unicode中。不是ascii。

其他提示

首先:我对arb_fragment_program不了解太多,所以我在这里部分猜测。

您的最佳选择是获取错误字符串(GLGETSTRING(GL_PROGRAME_ERROR_STRING_ARB)),看看告诉您什么。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top