0

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

目前(我无法更改),我引用了一个名为 BaseAddress 的无符号短 * 变量,并且基本的第 3 方代码访问 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: 方法中,我有以下内容:

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

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

4

1 回答 1

0

我认为最好使用纹理,对于您的情况,我会尝试为 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 < backingWidth) textureWidth = textureWidth << 1;) 的幂的维度并将其传递为 NULL 作为数据指针(全部在函数“glTexImage2D”中)

然后为与纹理相同的正方形生成顶点数组,从 (0,0) 到 (textureWidth, textureHeight) 和从 (0,0) 到 (1,1) 的纹理坐标

当您将数据获取到指针并准备好推送到纹理时,使用glTexSubImage2D更新它:如果您获取数据或更新整个屏幕,则只能更新纹理的一部分,使用 rect (0,0,screenWidth , 屏幕高度)

现在只需用您的纹理绘制这两个三角形..

  • 请注意,纹理大小有限制:大多数活动 iOS 设备 1<<11 (2048) iPad3 1<<12
  • 创建时不要忘记设置纹理参数:glTexParameteri
  • 如果需要,请检查视网膜显示并将 CAEAGLLayer 的内容比例设置为 2
于 2012-09-12T09:57:02.513 回答