-4

我已经获得了 h.264 数据并将它们解码为 YUV 缓冲区,并且我在 ios5 和 ios6 上通过 opengl 显示了 yup 数据,但是当我尝试在我的 iPad(ios4.2.1)上运行它时,它当前无法显示,只是所有的屏幕绿色。我不知道为什么,这是我的代码:

-(void)playVideoData:(void *)data
{

if (!_textureY)
{
    glGenTextures(1, &_textureY);
    glGenTextures(1, &_textureU);
    glGenTextures(1, &_textureV);
}

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _textureY);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, _videoW, _videoH, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, y);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _textureU);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, _videoW/2, _videoH/2, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, u);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, _textureV);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, _videoW/2, _videoH/2, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, v);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

[self render];

}
- (无效)渲染{

glViewport(viewportx,viewporty, VIEWWIDTH, VIEWHEIGHT);
glClearColor(0.0, 0, 0.0, 0);
glClear(GL_COLOR_BUFFER_BIT);

glUseProgram(programId);

// Update uniform value
//glUniform1f(uniforms[UNIFORM_TRANSLATE], 0.0f);
GLuint textureUniformY = glGetUniformLocation(programId, "SamplerY");
GLuint textureUniformU = glGetUniformLocation(programId, "SamplerU");
GLuint textureUniformV = glGetUniformLocation(programId, "SamplerV");

// Update attribute values
glVertexAttribPointer(ARDRONE_ATTRIB_POSITION, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ARDRONE_ATTRIB_POSITION);

glVertexAttribPointer(ARDRONE_ATTRIB_TEXCOORD, 2, GL_FLOAT, 0, 0, coordVertices);
glEnableVertexAttribArray(ARDRONE_ATTRIB_TEXCOORD);




glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _textureY);
glUniform1i(textureUniformY, 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _textureU);
glUniform1i(textureUniformU, 1);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, _textureV);
glUniform1i(textureUniformV, 2);

} -(void)drawFrame2
{

if (context != nil)
{
    //make it the current context for rendering
    [EAGLContext setCurrentContext:context];

    //if our framebuffers have not been created yet, do that now!
    if (!defaultFramebuffer)
        [self createFramebuffer];

    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

    [self playVideoData];
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);




    [context presentRenderbuffer:GL_RENDERBUFFER];
}
else
    NSLog(@"Context not set!");

}

我已将数据放入 yuv 缓冲区,这里是我的 fsh 和 vsh:

    vsh:    

    attribute vec4 position; // 1

    //uniform float translate;

    attribute vec2 TexCoordIn; // New

    varying vec2 TexCoordOut; // New

    void main(void)

    {
    gl_Position = position; // 6

    TexCoordOut = TexCoordIn;

    }

    fsh:

    varying lowp vec2 TexCoordOut;

    uniform sampler2D SamplerY;

    uniform sampler2D SamplerU;

    uniform sampler2D SamplerV;


    void main(void)
   {

   mediump vec3 yuv;

   lowp vec3 rgb;

   yuv.x = texture2D(SamplerY, TexCoordOut).r;

   yuv.y = texture2D(SamplerU, TexCoordOut).r - 0.5;

   yuv.z = texture2D(SamplerV, TexCoordOut).r - 0.5;    

   rgb = mat3( 1,       1,         1,
           0,       -0.39465,  2.03211,
           1.13983, -0.58060,  0) * yuv;

   gl_FragColor = vec4(rgb, 1);

   }

iOs4.2 没有错误,shaders 编译正常,但是就是不能显示...

4

1 回答 1

1

这是因为GL_RED_EXT您用于上传纹理的扩展仅在 iOS 5.0 中添加,而在 iOS 4.2 中不存在。您将无法使用它以这种方式上传 YUV 纹理,因此您需要重写代码的那部分。另外,我相信这个扩展只支持 iPad 2 和更新的设备,而不是原始的 iPad 和旧的 iPhone,所以你甚至不能在 iOS 5+ 上为旧的设备使用它。

于 2012-12-09T16:59:36.637 回答