【问题标题】:Reading a openGL ES texture to a raw array将 openGL ES 纹理读取到原始数组
【发布时间】:2012-06-11 23:21:05
【问题描述】:

我正在尝试从 openGL ES 中的 RGBA 纹理中获取字节。我想我正在尝试从原版 openGL 中模仿 glGetTexImage。就像现在一样,像素都是零,从调用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];
}

我做错了什么?

【问题讨论】:

  • 添加了问题描述。对不起,谢谢。

标签: objective-c opengl-es textures


【解决方案1】:

因此,我最终能够使用here 所见代码的变体解决此问题。我的代码是:

@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

我希望这对其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多