glProgramStringARB che causa GL_INVALID_OPERATION & # 8230; o Aiuto con i programmi di frammentazione
Domanda
Sto cercando di scrivere un programma per frammenti che prenderà una trama e fisserà i texel tra due valori. Cioè, se il valore minimo è 0,2 e il valore massimo è 0,6, qualsiasi texel inferiore a 0,2 diventerà 0, qualsiasi texel maggiore di 0,6 diventerà 1,0 e tutti i valori tra saranno mappati da 0 a 1,0.
La mia chiamata a glProgramStringARB è causa di GL_INVALID_OPERATION. Non riesco a capire perché questo stia accadendo. Per favore aiutate.
Questo è il mio primo tentativo di scrivere uno shader, quindi non sono del tutto sicuro di quello che sto facendo. Ecco il mio codice:
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);
Quindi per usarlo faccio quanto segue:
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);
Soluzione
Non ho davvero programmato alcun shader, ma forse il compilatore shader non riconosce la nuova riga? hai provato a mettere " \ n \ r " ;?
EDIT:
Un'altra domanda che potresti farti è quale lingua stai usando? Le stringhe sono in UNICODE, ovvero 16 bit / carattere? Ho appena notato che il formato che stai passando in glProgramStringARB () è impostato su ASCII. Se la stringa è davvero UNICODE, allora causerà problemi.
Ad esempio, le stringhe JAVA e C # sono in UNICODE. non ASCII.
Altri suggerimenti
Primo: non so molto su ARB_fragment_program, quindi in parte indovino qui.
La tua migliore opzione sarebbe quella di ottenere la stringa di errore (glGetString (GL_PROGRAM_ERROR_STRING_ARB)) e vedere cosa ti dice.
Dopo aver visto lo shader, sembra che tu stia utilizzando il numero errato di componenti nelle righe 3 e 7 (e probabilmente un po 'di più). Ad esempio, non penso che tu possa assegnare un vettore a 4 componenti (fragment.texcoord [1]) a un campo scalare (R0.x).