glProgramStringARB provoca GL_INVALID_OPERATION & # 8230; o ayuda con programas fragmentados

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Estoy tratando de escribir un programa de fragmentos que tome una textura y sujete los texels entre dos valores. Es decir, si el valor mínimo es 0.2 y el valor máximo es 0.6, cualquier texel menor que 0.2 se convertirá en 0, cualquier texel mayor que 0.6 se convertirá en 1.0, y todos los valores intermedios se asignarán de 0 a 1.0.

Mi llamada a glProgramStringARB es causar una GL_INVALID_OPERATION. Parece que no puedo entender por qué sucede esto. Por favor ayuda.

Este es mi primer intento de escribir un sombreador, así que no estoy completamente seguro de lo que estoy haciendo. Aquí está mi 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);

Luego, para usarlo, hago lo siguiente:

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

Solución

Realmente no he programado ningún sombreador, pero ¿tal vez el compilador de sombreadores no reconoce la nueva línea? ¿Has intentado poner " \ n \ r " ;?

EDITAR:

Otra pregunta que puede hacerse es qué idioma está utilizando. ¿Las cadenas están en UNICODE, es decir, 16 bits / char? Acabo de notar que el formato que está pasando a glProgramStringARB () está establecido en ASCII. Si la cadena es realmente UNICODE, causará problemas.

Por ejemplo, las cadenas JAVA y C # están en UNICODE. no ASCII.

Otros consejos

Primero: no sé mucho sobre ARB_fragment_program, así que estoy adivinando en parte aquí.

Su mejor opción sería obtener la cadena de error (glGetString (GL_PROGRAM_ERROR_STRING_ARB)) y ver qué le dice eso.

Después de mirar el sombreador, parece que está usando un número incorrecto de componentes en las líneas 3 y 7 (y probablemente algunos más). Por ejemplo, no creo que pueda asignar un vector de 4 componentes (fragment.texcoord [1]) a un campo escalar (R0.x).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top