-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 エラーなし、シェーダーは正常にコンパイルされますが、表示できません...

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 に答える