Il mio problema è ottenere più di una trama accessibile in uno shader GLSL. Ecco quello che sto facendo:Più trame in GLSL - solo una funziona
Shader:
uniform sampler2D sampler0;
uniform sampler2D sampler1;
uniform float blend;
void main(void)
{
vec2 coords = gl_TexCoord[0];
vec4 col = texture2D(sampler0, coords);
vec4 col2 = texture2D(sampler1, coords);
if (blend > 0.5){
gl_FragColor = col;
} else {
gl_FragColor = col2;
}
};
Così, ho semplicemente scegliere tra i due valori di colore sulla base di una variabile uniforme. Abbastanza semplice (questo è un test), ma al posto del comportamento previsto, ottengo tutto nero
quando si miscela < = 0,5
.
codice OpenGL:
m_sampler0location = m_shader.FindUniform("sampler0");
m_sampler1location = m_shader.FindUniform("sampler1");
m_blendlocation = m_shader.FindUniform("blend");
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler0location, 0);
glBindTexture(GL_TEXTURE_2D, Texture0.Handle);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler1location, 1);
glBindTexture(GL_TEXTURE_2D, Texture1.Handle);
glBegin(GL_QUADS);
//lower left
glTexCoord2f(0, 0);
glVertex2f(-1.0, -1.0);
//upper left
glTexCoord2f(0, maxCoords0.t);
glVertex2f(-1.0, 1.0);
//upper right
glTexCoord2f(maxCoords0.s, maxCoords0.t);
glVertex2f(1.0, 1.0);
//lower right
glTexCoord2f(maxCoords0.s, 0);
glVertex2f(1.0, -1.0);
glEnd()
Lo shader viene compilato e legato prima di tutto questo. Tutti i controlli di integrità in quel processo indicano che va bene.
Come ho già detto, il valore di
Risolto in base alla risposta di Bahbar.col
nel programma shader riflette i frammenti di una trama; il valore di
col2
è nero. La trama visualizzata è l'ultima trama attiva: se cambio l'ultimo
glBindTexture
per il binding
Texture0.Handle
, la trama cambia.
Allo stato attuale, la scena viene visualizzata in nero, anche se aggiungo qualcosa come gl_FragColor.r = blend;
come ultima riga dello shader. Tuttavia, se commento la chiamata glActiveTexture(GL_TEXTURE1);
, lo shader funziona di nuovo e la stessa texture appare sia in sampler0 che in sampler1.
Cosa sta succedendo? La linea in questione, glActiveTexture(GL_TEXTURE1);
, sembra funzionare correttamente, come evidenziato da un successivo glGetIntegerv(GL_ACTIVE_TEXTURE, &anint)
. Perché rompe tutto così orribilmente? Ho già provato ad aggiornare i miei driver di visualizzazione.
Hai trovato una soluzione al tuo problema? Ho lo stesso identico problema. – Andrea3000
Sì, la soluzione con tag ha funzionato per me. – appas