2012-02-21 6 views
5

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.

+0

Si dovrebbe anche pubblicare lo shader. –

+2

Hai provato a nominarlo qualcos'altro (la texture è anche una funzione GLSL incorporata, mentre non tecnicamente una parola chiave non garantirei che funzionerà). – KillianDS

+0

Ho provato a rinominare la divisa in "myTexture" ma il risultato è lo stesso, sfortunatamente. – fescrb

risposta

3

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 glGerUniformiv restituisce ancora 0, ma la trama utilizzata è quella corretta.