首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将openGL ES纹理读取到原始数组

将openGL ES纹理读取到原始数组
EN

Stack Overflow用户
提问于 2012-06-09 03:07:14
回答 1查看 3.8K关注 0票数 3

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

这是一个从Sparrow Framework扩展SPTexture的类别中的方法。

代码语言:javascript
复制
-(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];
}

我做错了什么?

EN

Stack Overflow用户

回答已采纳

发布于 2012-06-11 23:21:06

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

代码语言:javascript
复制
@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

我希望这对其他人有用。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10954703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档