Iphone 在iOS上使用OpenGLES从无符号短*绘制像素的基本图形

Iphone 在iOS上使用OpenGLES从无符号短*绘制像素的基本图形,iphone,ios,opengl-es,drawing,Iphone,Ios,Opengl Es,Drawing,对于我的非应用商店应用程序,我一直使用私有框架核心表面直接绘制到iPhone屏幕上。但是,在较旧的设备上,这可能相当慢,因为它大量使用CPU进行绘图。为了解决这个问题,我决定尝试使用OpenGLES将像素渲染到屏幕上 目前(我没有办法改变这一点),我引用了一个名为BaseAddress的无符号short*变量,基本第三方代码访问BaseAddress并用新的像素数据更新它 我已经设置了一个GLKViewController,并实现了viewDidLoad,如下所示: - (void)viewDi

对于我的非应用商店应用程序,我一直使用私有框架核心表面直接绘制到iPhone屏幕上。但是,在较旧的设备上,这可能相当慢,因为它大量使用CPU进行绘图。为了解决这个问题,我决定尝试使用OpenGLES将像素渲染到屏幕上

目前(我没有办法改变这一点),我引用了一个名为BaseAddress的无符号short*变量,基本第三方代码访问BaseAddress并用新的像素数据更新它

我已经设置了一个GLKViewController,并实现了viewDidLoad,如下所示:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    [EAGLContext setCurrentContext:self.context];

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;

    glGenBuffers(1, &screenBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, screenBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(BaseAddress), BaseAddress, GL_DYNAMIC_DRAW);

}
其中screenBuffer是一个实例变量。在glkView:drawInRect:method中,我有以下内容:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    glDrawElements(GL_ARRAY_BUFFER, sizeof(BaseAddress)/sizeof(BaseAddress[0]), GL_UNSIGNED_SHORT, BaseAddress);
}

不幸的是,当我运行应用程序时,只有一个黑屏出现。如果我继续使用Core Surface,该应用程序运行良好。因此,基本上,如何使用OpenGLES将像素绘制到屏幕上?

我认为最好使用纹理,对于您的情况,我会尝试为iOS设备找到一些旧的ES1模板。基本上,您需要的是从UIView层制作的帧缓冲区和颜色缓冲区:

    glGenFramebuffers(1, &viewFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);
    glGenRenderbuffers(1, &viewColorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, viewColorBuffer);
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewColorBuffer);

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, & backingHeight);
至于投影矩阵,我建议您使用
glOrthof(.0f,backingWidth,backingHeight,.0f,-1.0f,1.0f)将使GL坐标与视图坐标相同


接下来在一些初始化中生成一个纹理,绑定它,并给它2次方的维度(
textureWidth=1;while(textureWidth