[英]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);
}
此代碼使用GLKit的GLKTextureLoader ,但是可以將其替換為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.