国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS之OpenGL ES【1】:基本認識和理解

2019-11-06 09:59:09
字體:
來源:轉載
供稿:網友

一、什么是 OpenGL ES?

iOS上繪制圖形的方式很多,UIKit,CoreGraphics,SPRiteKit,OpenGL ES,Metal等。OpenGL ES是一套非常底層但使用非常廣泛的C語言API,專為移動設備定制,可在不同的手機系統或瀏覽器上使用,渲染效果很好。

二、iOS的OpenGL ES的使用:

新建一個工程之后,在系統庫中需要添加導入OpenGLES.framework和QuartzCore.framework兩個庫;新建一個單獨實現OpenGL ES的類,命名為OpenGLView,并引入#import "OpenGLView.h"#import <QuartzCore/QuartzCore.h>#import <OpenGLES/ES2/gl.h>#import <OpenGLES/ES2/glext.h>在OpenGLView的.m的延展中聲明如下實例變量:@interface OpenGLView () { CAEAGLLayer *eaglLayer; //OpenGL context,管理使用openGLES進行繪制的狀態,命令及資源 EAGLContext *eaglContext; GLuint colorRenderBuffer;//渲染緩沖區 GLuint frameBuffer;//幀緩沖區}繼續在.m中實現layerClass方法: + (Class)layerClass { //為了讓 UIView 顯示 openGL 內容,必須將默認的layer類型修改為CAEAGLLayer類型 return [CAEAGLLayer class];}CAEAGLLayer的配置:默認的 CALayer 是透明的,需要將它設置為 opaque == YES 才能看到在它上面描繪的東西。為此,使用匿名 category 技巧,在 OpenGLView.m的開頭(在@interface OpenGLView 的上面)添加匿名 category,并聲明私有函數 setupLayer并在implementation中實現: + (void)setupLayer { eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; // 描繪屬性:這里不維持渲染內容 // kEAGLDrawablePropertyRetainedBacking:若為YES,則使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)計算得到的最終結果顏色的透明度會考慮目標顏色的透明度值。 // 若為NO,則不考慮目標顏色的透明度值,將其當做1來處理。 // 使用場景:目標顏色為非透明,源顏色有透明度,若設為YES,則使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)得到的結果顏色會有一定的透明度(與實際不符)。若未NO則不會(符合實際)。 eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],kEAGLDrawablePropertyRetainedBacking,kEAGLColorFormatRGBA8,kEAGLDrawablePropertyColorFormat, nil];}EAGLContext渲染上下文: - (void)setupContext { eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; if (!eaglContext) { exit(1); } if (![EAGLContext setCurrentContext:eaglContext]) { exit(1); }}創建RenderBuffer:用于存儲渲染的內容(OpenGL ES 總共有三大不同用途的color buffer,depth buffer 和 stencil buffer,這里創建私有方法setupRenderBuffer來生成 color buffer; - (void)setupRenderBuffer { if (colorRenderBuffer) { glDeleteBuffers(1, &colorRenderBuffer); frameBuffer = 0; } // 生成一個renderBuffer,id是colorRenderBuffer glGenBuffers(1, &colorRenderBuffer); // 設置為當前renderBuffer,則后面引用GL_RENDERBUFFER,即指的是colorRenderBuffer glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer); // 為colorRenderBuffer分配存儲空間 [eaglContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:eaglLayer];}FrameBuffer:renderBuffer對象本身不能直接使用,不能掛載到GPU上直接輸出內容,要使用frameBuffer(OpenGlES的FrameBuffer包含:renderBuffer,depthBuffer,stencilBuffer和accumulationBuffer);- (void)setupFrameBuffer { if (frameBuffer) { glGenBuffers(1, &frameBuffer); frameBuffer = 0; } // FBO用于管理colorRenderBuffer,離屏渲染 glGenFramebuffers(1, &frameBuffer); // 設置為當前frameBuffer glBindRenderbuffer(GL_FRAMEBUFFER, frameBuffer); // 將colorRenderBuffer裝配到GL_COLOR_ATTACHMENT0這個裝配點上 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderBuffer);}當 UIView 在進行布局變化之后,由于 layer 的寬高變化,導致原來創建的 renderbuffer不再相符,需要銷毀既有的 renderbuffer 和 framebuffer; - (void)destoryRenderAndFrameBuffer { glDeleteFramebuffers(1, &frameBuffer); frameBuffer = 0; glDeleteRenderbuffers(1, &colorRenderBuffer); colorRenderBuffer = 0;}聲明一個render方法進行真實描繪: - (void)render { // 設置清屏顏色 glClearColor(0, 1.0, 0, 1.0); // 用來指定要用清屏顏色來清除由mask指定的buffer,此處是color buffer glClear(GL_COLOR_BUFFER_BIT); [eaglContext presentRenderbuffer:GL_RENDERBUFFER];}最后在實現layoutSubviews方法:- (void)layoutSubviews { [self setupLayer]; [self setupContext]; [self destoryRenderAndFrameBuffer]; [self setupRenderBuffer]; [self setupFrameBuffer]; [self render];}完成了OpenGLView的基本構造之后,利用OpenGLView在界面上進行渲染:在ViewController中導入#import “OpenGLView.h”,并聲明一個OpenGLView的實例屬性,在viewDidLoad中調用即可: self.glView = [[OpenGLView alloc] init]; self.glView.frame = self.view.frame; [self.view addSubview:self.glView]; self.view.backgroundColor = [UIColor redColor];
上一篇:iOS真機與模擬器

下一篇:iOS 數組排序

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 榆林市| 齐齐哈尔市| 金华市| 高邮市| 尚志市| 清镇市| 黑河市| 论坛| 南通市| 德兴市| 同江市| 西吉县| 广饶县| 秦安县| 雷州市| 库伦旗| 安康市| 定南县| 鹤壁市| 昆山市| 宁蒗| 博爱县| 霍邱县| 旬邑县| 河源市| 平远县| 天津市| 大安市| 教育| 徐水县| 封丘县| 轮台县| 临江市| 龙胜| 伊吾县| 韶关市| 竹北市| 深泽县| 卓资县| 陵水| 高唐县|