Por que não consigo anexar essa textura uniforme ao meu shader de fragmento GLSL?

No meu aplicativo para Mac, defino uma textura retangular com base nos dados YUV 4: 2: 2 de uma câmera conectada. Usando coordenadas padrão de vértice e textura, posso desenhar isso em uma área retangular na tela sem problemas.

No entanto, eu gostaria de usar um shader de fragmento GLSL para processar esses quadros de imagem na GPU e estou tendo problemas para passar na textura retangular de vídeo como um uniforme para o shader de fragmento. Quando tento fazê-lo, a textura é simplesmente preta.

O programa shader compila, vincula e passa na validação. Estou recebendo o endereço apropriado para o uniforme do programa shader. Outros uniformes, como valores de ponto flutuante, são transmitidos corretamente e o sombreador de fragmentos responde a alterações nesses valores. O shader de fragmento recebe as coordenadas de textura corretas. Também borrifei meu código liberalmente com glGetError () e não vi erros em lugar algum.

O sombreador de vértice é o seguinte:

void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
}

e o shader de fragmento é o seguinte:

uniform sampler2D videoFrame;

void main()
{
    gl_FragColor = texture2D(videoFrame, gl_TexCoord[0].st);
}

Isso deve simplesmente exibir a textura na minha geometria retangular.

O código de desenho relevante é o seguinte:

static const GLfloat squareVertices[] = {
    -1.0f, -1.0f,
    1.0f, -1.0f,
    -1.0f,  1.0f,
    1.0f,  1.0f,
};

const GLfloat textureVertices[] = {
    0.0, videoImageSize.height,
    videoImageSize.width, videoImageSize.height,
    0.0, 0.0,
    videoImageSize.width, 0.0
};

CGLSetCurrentContext(glContext);

if(!readyToDraw)
{
    [self initGL];
    readyToDraw = YES;
}


glViewport(0, 0, (GLfloat)self.bounds.size.width, (GLfloat)self.bounds.size.height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);

glGenTextures(1, &textureName);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName);

glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, videoImageSize.width, videoImageSize.height, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, videoTexture);  

glUseProgram(filterProgram);    

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glTexCoordPointer(2, GL_FLOAT, 0, textureVertices);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

[super drawInCGLContext:glContext pixelFormat:pixelFormat forLayerTime:interval displayTime:timeStamp];

glDeleteTextures(1, &textureName);

Esse código reside em um CAOpenGLLayer, em que a superclasse está-drawInCGLContext:pixelFormat:forLayerTime: displayTime: simplesmente correglFlush().

O endereço uniforme é lido usando código como o seguinte:

uniforms[UNIFORM_VIDEOFRAME] = glGetUniformLocation(filterProgram, "videoFrame");

Como eu disse, se eu comentar oglUseProgram() eglUniform1i() linhas, esse retângulo texturizado desenha corretamente. Deixá-los leva a um retângulo preto sendo desenhado.

O que poderia estar impedindo que meu uniforme de textura fosse passado para o meu shader de fragmentos?

questionAnswers(1)

yourAnswerToTheQuestion