Sto usando OpenGL e GLSL per disegnare una trama su una mesh semplice.glUniform non riesce a impostare il valore del campionatore
Il mio problema è che quando uso glUniform1i
per impostare il valore di un'uniforme sampler2D, non è stato impostato. Ad esempio, nel in questo codice:
glUseProgram(programObject);
glUniform1i(glGetUniformLocation(programObject, "texture"), 1);
GLint val;
glGetUniformiv(programObject,
glGetUniformLocation(programObject, "texture"),
&val);
printf("Value is %d\n", val);
Il valore stampato alla riga di comando fuori è 0. Ho verificato che gli shader sono compilati correttamente e che il programma è collegato in modo corretto. glGetUniformLocation
emette un indice> 0. Inoltre, glGetError
non emette alcun errore in alcun punto.
Ciò accade solo quando l'uniforme è un campionatore. Poiché la trama non è impostata, la sospensione nello shader ritorna sempre (0, 0, 0, 1). (Ho anche verificato, usando apitrace, che la mia texture è vincolata correttamente a GL_TEXTURE1
, che viene eseguita immediatamente dopo il codice mostrato).
Ho cercato estesamente per questo problema e ho trovato solo un'istanza di qualcosa di simile a questo here. La soluzione era inizializzare GLEW, ma questo non ha funzionato per me.
Sono felice di fornire qualsiasi informazione estesa necessaria (o la traccia dall'apitrace).
Modifica
Ecco lo shader:
uniform sampler2D texture;
varying vec2 textureCoord;
void main() {
gl_FragColor = texture2D(texture, textureCoord);
}
Soluzione
sono riuscito a risolvere il problema dopo un po 'di lavoro.
Come si è visto, questo problema non era dovuto all'uniforme non impostata, poiché sempre il ritorno 0 per i campionatori indipendentemente dal valore effettivo sembra essere una stranezza dell'implementazione gl. Questo è successo solo con il driver Intel per Sandy Bridge. Il test del codice sotto altre implementazioni ha sempre restituito il valore del campionatore corretto.
Il problema del ritorno della trama (0, 0, 0, 1) era sempre dovuto a un errore che ho fatto durante la generazione della trama.
Ora lo glGerUniformiv
restituisce ancora 0, ma la trama utilizzata è quella corretta.
Si dovrebbe anche pubblicare lo shader. –
Hai provato a nominarlo qualcos'altro (la texture è anche una funzione GLSL incorporata, mentre non tecnicamente una parola chiave non garantirei che funzionerà). – KillianDS
Ho provato a rinominare la divisa in "myTexture" ma il risultato è lo stesso, sfortunatamente. – fescrb