3

我正在尝试从 openGL ES 中的 RGBA 纹理中获取字节。我想我正在尝试模仿glGetTexImage香草 openGL。就像现在一样,像素都是零,从调用到glClear,而不是我正在寻找的纹理数据。

这是从 Sparrow 框架扩展 SPTexture 的类别中的一种方法。

-(NSMutableData *) getPixelsFromTexture
{
    GLsizei width = (GLsizei) self.width;
    GLsizei height = (GLsizei) self.height;
    GLint oldBind = 0;
    glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldBind);
    glBindTexture(GL_TEXTURE_2D, self.textureID);

    GLuint fbo[1];
    glGenFramebuffersOES(1, fbo);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo[0]);

    GLuint rbo[1];
    glGenRenderbuffersOES(1, rbo);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, rbo[0]);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA4_OES, width, height);

    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, rbo[0]);

    GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
    if (status != GL_FRAMEBUFFER_COMPLETE_OES) {
        NSLog(@"Incomplete FBO");
    }

    // draw
    static float texCoords[8] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
    static float vertexCoords[8] = { -1.0f, -1.0f, 1-.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f };

    glMatrixMode (GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity ();
    glOrthof(0.0f, self.width, self.height, 0.0f, 0.0f, 1.0f);
    glMatrixMode (GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glVertexPointer(2, GL_FLOAT, 0, vertexCoords);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    // end draw

    GLsizei count = width * height * 4;
    GLubyte * pixels = (GLubyte *)malloc((sizeof(GLubyte) * count));
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, 0);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
    glBindTexture(GL_TEXTURE_2D, oldBind);
    glDeleteRenderbuffersOES(1, rbo);
    glDeleteFramebuffersOES(1, fbo);

    return [NSMutableData dataWithBytes:pixels length:count];
}

我究竟做错了什么?

4

1 回答 1

2

所以,我最终能够使用这里看到的代码的变体来解决这个问题。我的代码是:

@interface SPRenderTexture (RenderToImage)

- (NSMutableData *)renderToPixelData;

@end

@implementation SPRenderTexture (RenderToImage)

- (NSMutableData *)renderToPixelData
{
    __block NSMutableData * pixels = nil;

    [self bundleDrawCalls:^() 
    {
    float scale = [SPStage contentScaleFactor];
    int width = scale * self.width;
    int height = scale * self.height;
    int nrOfColorComponents = 4; //RGBA
    int rawImageDataLength = width * height * nrOfColorComponents;
    GLenum pixelDataFormat = GL_RGBA;
    GLenum pixelDataType = GL_UNSIGNED_BYTE;

    GLubyte *rawImageDataBuffer = (GLubyte *) malloc(rawImageDataLength);
    glReadPixels(0, 0, width, height, pixelDataFormat, pixelDataType, rawImageDataBuffer);

    pixels = [[NSMutableData alloc] initWithBytes:rawImageDataBuffer length:rawImageDataLength];

    }];

    return [pixels autorelease];
}

@end

我希望这对其他人有用。

于 2012-06-11T15:21:05.853 回答