0

我正在尝试编写一个片段程序,该程序将采用纹理并将纹素固定在两个值之间。也就是说,如果最小值为 0.2,最大值为 0.6,则小于 0.2 的任何 texel 将变为 0,大于 0.6 的任何 texel 将变为 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”吗?

编辑:

您可能会问自己的另一个问题是您使用的是什么语言?字符串是 UNICODE,即 16 位/字符吗?我刚刚注意到您传递给 glProgramStringARB() 的格式设置为 ASCII。如果字符串真的是 UNICODE,那么就会出现问题。

例如,JAVA 和 C# 字符串采用 UNICODE。不是ASCII。

于 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 回答