簡體   English   中英

iOS用OpenGL替換CATiledLayer

[英]IOS replace CATiledLayer with OpenGL

我有一個遙控器應用程序,它使用CATiledLayer顯示遠程桌面。 所有繪圖均由drawRect:方法完成。 調整遠程屏幕分辨率的大小時,我遇到了一些非常罕見的崩潰。

我試圖調試此問題,但沒有任何幫助,因此(在收到來自更聰明的大學的一些建議后),我決定使用CAEAGLLayer而不是CATiledLayer重寫代碼。

我當時正在學習OpenGL ES 2.0 ,但是所有這些教程都是關於構建3D模型的。 我想要的是能夠將紋理應用於View的適當區域。

根據我的閱讀和思考,我認為,當接收到要重繪的圖像時,我需要將其轉換為紋理 ,獲取應該重新繪制的rect並從中生成頂點 ,然后將varteces紋理路徑到頂點着色器

歡迎任何想法或建議。

(請不要寫類似“為什么要使用OpenGL而不是CATiledLayer?”之類的東西,即使這不是最佳選擇,我也想弄清楚如何使其以這種方式工作)。

好的,既然沒有回答我的問題,我將分享我所得到的。 首先,我正在使用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 ,它們除了將紋理映射到頂點外什么也不做。

CATiledLayer相比 ,OpenGL繪制的工作速度更快,雖然不是非常好,但是仍然可以。 我將來會調查一些小故障。

希望這對某人有用。 如果您需要更多詳細信息,請隨時與我聯系haawaplus@gmail.com

聚苯乙烯

由於我還有其他工作要做,現在我暫停了CATiledLayer-> OpenGL ES的調查,但是當我返回OpenGL時,我將更新答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM