OpenGL OES Iphone glCopyTexImage2D

时间:2011-09-27 09:45:39

标签: iphone opengl-es

我是iPhone上的openGL OES新手,并且glCopyTexImage2D存在内存问题。到目前为止,据我所知,此函数应将当前帧缓冲区复制到绑定纹理。但由于某种原因,它总是分配新的内存,我可以在检查分配的工具中看到。

我的目标是阅读纹理图像并在其上绘制,绘图后我想保存新纹理,这样我就可以滚动绘画了。所以这里可能是代码:

1)init opengl和framebuffer:

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

    if (!context || ![EAGLContext setCurrentContext:context]) {
        [self release];
        return nil;
    }

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_SRC_COLOR);

    // Setup OpenGL states
    glMatrixMode(GL_PROJECTION);


    CGRect frame = self.bounds;
    CGFloat scale = self.contentScaleFactor;
    // Setup the view port in Pixels
    glOrthof(0, frame.size.width * scale, 0, frame.size.height * scale, -1, 1);
    glViewport(0, 0, frame.size.width, frame.size.height * scale);

    glDisable(GL_DEPTH_TEST);
    glDisable(GL_DITHER);

    glMatrixMode(GL_MODELVIEW);
    glEnableClientState(GL_VERTEX_ARRAY);
    // Set a blending function appropriate for premultiplied alpha pixel data
    glEnable(GL_POINT_SPRITE_OES);
    glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE);
    glPointSize(64 / kBrushScale);

2)现在我将保存的图像加载到帧缓冲区中:

if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
    // load texture
    NSData* data = [[NSData alloc] initWithContentsOfFile:path];
    glGenTextures(1, &drawBoardTextures[i]);
    glBindTexture(GL_TEXTURE_2D, drawBoardTextures[i]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, [data bytes]);

    // free memory
    [data release];
}

3)最后渲染纹理:

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

int width = 1024;
GLfloat quad[] = {0.0,1024.0,1024.0,1024.0,0.0,0.0,1024.0,0.0};
GLfloat quadTex[] = {0.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0};

for (int i=0; i<10; i++) {
    quad[0] = width * i;
    quad[2] = quad[0] + width;
    quad[4] = quad[0];
    quad[6] = quad[2];
    glBindTexture(GL_TEXTURE_2D, drawBoardTextures[i]);
    glVertexPointer(2, GL_FLOAT, 0, quad);
    glTexCoordPointer(2, GL_FLOAT, 0, quadTex);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glBindTexture(GL_TEXTURE_2D, 0);

}

4)现在一切正常,使用gltranslatef我可以滚动纹理,也没有在乐器中观察到的分配。所以现在我在当前窗口上绘制并希望保存结果,如下所示:

        int texIndex = offset.x/1024;
    float diff = offset.x - (1024*texIndex);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);    
    glBindTexture(GL_TEXTURE_2D, drawBoardTextures[texIndex]); 

    glBindTexture(GL_TEXTURE_2D, drawBoardTextures[texIndex]);
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, diff, 0, 0, 0, 1024-diff, 1024); 
    glBindTexture(GL_TEXTURE_2D, drawBoardTextures[texIndex + 1]);
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024-diff, 0, diff, 1024);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glFlush();

没有问题开始。而不是直接将其写入生成的纹理,它将其写入客户端内存。对于每个复制的纹理,它使用~4 MB的Ram,但每个复制都不需要任何内存。我真的不知道我做错了什么。

有谁知道问题是什么?非常感谢你的帮助。

欢呼声

克里斯

0 个答案:

没有答案