Glprogramstringarb causando gl_invalid_operation… ou ajuda com programas de fragmento

StackOverflow https://stackoverflow.com/questions/339042

  •  19-08-2019
  •  | 
  •  

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);
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top