1

我有一个遥控器应用程序,它使用CATiledLayer来显示远程桌面。所有的绘图都是由drawRect:方法制作的。调整远程屏幕的分辨率时,我遇到了一些非常罕见的崩溃。

我试图调试这个问题,但没有任何帮助,所以(在收到我更聪明的大学的一些建议后)我决定使用CAEAGLLayer而不是CATiledLayer重写我的代码。

我正在学习OpenGL ES 2.0,但所有这些教程都是关于构建 3D 模型的。我想要的只是能够将纹理应用到视图上的适当区域。

根据我的阅读和思考,我认为,当接收到要重绘的图像时,我需要将其转换为texture,获取应该重绘的rect并从中生成顶点,然后将路径varteces纹理传递顶点着色器

欢迎任何想法或建议。

(请不要这样写:“为什么要使用 OpenGL 而不是 CATiledLayer?”即使这不是最佳选择,我也想弄清楚如何使它以这种方式工作)。

4

1 回答 1

0

好的,由于我的问题没有回复,我将分享我所拥有的。首先,我使用的是OpenGL ES 2.0

1)我像这样画两个三角形来覆盖整个屏幕

在此处输入图像描述

存储顶点和三角形我使用以下结构(在我的情况下不使用颜色值):

typedef struct {
    float Position[3];
    float Color[4];
    float TexCoord[2];
} Vertex;

const Vertex Vertices[] = {
    {{1, -1, 0}, {1, 0, 0, 1}, {1, 0}},
    {{1, 1, 0}, {0, 1, 0, 1}, {1, 1}},
    {{-1, 1, 0}, {0, 0, 1, 1}, {0, 1}},
    {{-1, -1, 0}, {0, 0, 0, 1}, {0, 0}}
};

const GLubyte Indices[] = {
    0, 1, 2,
    2, 3, 0
};

2)完成后,我等待整个远程屏幕加载图像,然后使用以下代码将整个屏幕的图像设置为纹理:

-(void)setupTextureFromCGImage:(CGImageRef)imageRef{

    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithBool:_snapshot.isImageMirrored],
                              GLKTextureLoaderOriginBottomLeft,
                              nil];

    NSError * error;
    GLKTextureInfo * info = [GLKTextureLoader textureWithCGImage:imageRef options:options error:&error];
    if (info == nil) {
        NSLog(@"Error loading file: %@", [error localizedDescription]);
        return;
    }
    self.effect.texture2d0.name = info.name;
    self.effect.texture2d0.enabled = true;
    _bigTexture = info.name;
    glBindTexture(GL_TEXTURE_2D, self.effect.texture2d0.name);
}

此代码使用GLKitGLKTextureLoader,但是可以简单地将其替换为glteximage2d()

之后该视图看起来与此类似:

在此处输入图像描述

3)收到更新后,我们需要更新图像和矩形来知道要更新哪个部分:

-(void)loadSubImageTextureImageBuffer:(const char *)buffer inRect:(CGRect)rect
{
CGRect rectGL = rect;
rectGL.origin.y = _snapshot.imageRect.size.height - (rectGL.origin.y +     rectGL.size.height);// convert coordinates from UIView's upper left to OpenGL's lower left

glTexSubImage2D(GL_TEXTURE_2D,
                    0,
                    rectGL.origin.x,
                    rectGL.origin.y,
                    rectGL.size.width,
                    rectGL.size.height,
                    GL_BGRA,
                    GL_UNSIGNED_BYTE,
                    buffer);
}

对于绘图,我使用自定义着色器而不是GLKView,它们只会将纹理映射到顶点。

OpenGL 绘图的工作速度比CATiledLayer快,不是非常但仍然。有一些小故障,我将在未来进行调查。

希望这对某人有用。如果您需要更多详细信息,请随时与我联系 haawaplus@gmail.com

附言

现在我暂停了我的CATiledLayer -> OpenGL ES调查,因为我还有其他工作要做,但是当我回到 OpenGL 时我会更新我的答案。

于 2013-08-12T12:30:31.800 回答