OpenGL OES Iphone glCopyTexImage2D

OpenGL OES Iphone glCopyTexImage2D,iphone,opengl-es,Iphone,Opengl Es,我是iPhone上openGL OES的新手,glCopyTexImage2D存在内存问题。据我所知,此函数应将当前帧缓冲区复制到绑定纹理。但出于某种原因,它总是分配新内存,我可以在检查分配的工具中看到这一点 我的目标是阅读纹理图像并在其上绘制,绘制后我想保存新的纹理,这样我就可以在绘画中滚动。下面是may代码: 1) init opengl和帧缓冲区: context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

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

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

1) init opengl和帧缓冲区:

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);
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];
}
2) 现在,我将保存的图像加载到帧缓冲区:

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);
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 MB的Ram,但每个重新复制不需要任何内存。我真的不知道我做错了什么

有人知道问题出在哪里吗?非常感谢你的帮助

干杯


克里斯

欢迎来到SO,我希望您已经阅读了。