Glprogramstringarb causando gl_invalid_operation… ou ajuda com programas de fragmento
Pergunta
Estou tentando escrever um programa de fragmentos que levará uma textura e prenderá os Texels entre dois valores. Ou seja, se o valor mínimo for 0,2 e o valor máximo for 0,6, qualquer Texel menor que 0,2 se tornará 0, qualquer Texel maior que 0,6 se tornará 1,0 e todos os valores entre o meio será mapeado de 0 a 1,0.
Minha chamada para GlProgramstringarb é causada por um gl_invalid_operation. Não consigo descobrir por que isso está acontecendo. Por favor ajude.
Esta é a minha primeira tentativa de escrever um shader, então não tenho muita certeza do que estou fazendo. Aqui está o meu código:
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);
Então, para usá -lo, faço o seguinte:
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);
Solução
Eu realmente não programei nenhum shaders, mas talvez o compilador de shader não reconheça a nova linha? Você já tentou colocar " n r"?
EDITAR:
Outra pergunta que você pode fazer é qual idioma você está usando? As cordas são unicode, ou seja, 16 bits/char? Acabei de notar que o formato que você está passando para o glprogramstringarb () está definido como ASCII. Se a string for realmente unicode, ela causará problemas.
Por exemplo, as cordas Java e C# estão no Unicode. não ascii.
Outras dicas
Primeiro: não sei muito sobre arb_fragment_program, então estou em parte adivinhando aqui.
Sua melhor opção seria obter a string de erro (GlgetString (GL_PROGRAM_ERROR_STRING_ARB)) e ver o que isso diz.
Depois de olhar para o shader, você parece estar usando o número errado de componentes nas linhas 3 e 7 (e provavelmente um pouco mais). Por exemplo, não acho que você possa atribuir um vetor de 4 componentes (fragment.texcoord [1]) a um campo escalar (r0.x).