OpenGL ES GLKit初探
#GLKit框架 GLKit框架的設(shè)計(jì)目的是為了簡(jiǎn)化OpenGL/OpenGL ES的應(yīng)用開發(fā)。它的出現(xiàn)加快了OpenGL或OpenGL ES應(yīng)用程序的開發(fā)。使用數(shù)學(xué)庫(kù)、背景紋理加載,預(yù)先創(chuàng)建著色器效果,以及標(biāo)準(zhǔn)視圖和視圖控制器來(lái)實(shí)現(xiàn)渲染循環(huán)。 GLKit框架提供了功能和類,可以減少創(chuàng)建新的基于著色器的應(yīng)?程序所需的?作量, 或者支持依賴早期版本的OpenGL ES或OpenGL提供的固定函數(shù)頂點(diǎn)或?段處理的現(xiàn)有 應(yīng)用程序。
#GLKView 、GLKViewController 在iOS平臺(tái)下,蘋果給我們封裝好了GLKViewController這樣的一個(gè)類,簡(jiǎn)化了我們通過(guò)OpenGL ES渲染圖形的工作。
//初始化GLKView - (instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;//顏色渲染緩沖區(qū)格式 @property (nonatomic) GLKViewDrawableColorFormat drawableColorFormat;//深度渲染緩沖區(qū)格式 @property (nonatomic) GLKViewDrawableDepthFormat drawableDepthFormat;//模板渲染緩沖區(qū)格式 @property (nonatomic) GLKViewDrawableStencilFormat drawableStencilFormat;//多重采樣緩沖區(qū)格式 @property (nonatomic) GLKViewDrawableMultisample drawableMultisample;//幀緩沖區(qū)屬性 @property (nonatomic, readonly) NSInteger drawableWidth; //緩沖區(qū)對(duì)象寬度 @property (nonatomic, readonly) NSInteger drawableHeight; //緩沖區(qū)對(duì)象高度/** * GLKViewDelegate必須實(shí)現(xiàn)的方法:在這個(gè)方法里進(jìn)行繪圖 * - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect; */ @property (nullable, nonatomic, assign) IBOutlet id <GLKViewDelegate> delegate;//將底層的FrameBuffer對(duì)象綁定到OpenGL ES - (void)bindDrawable;//刪除視圖FrameBuffer對(duì)象 - (void)deleteDrawable;//繪制視圖內(nèi)容并將其作為圖像對(duì)象返回 @property (readonly, strong) UIImage *snapshot;//布爾,指定視圖是否響應(yīng)使得視圖內(nèi)容無(wú)效的信息 @property (nonatomic) BOOL enableSetNeedsDisplay;//立即重繪 - (void)display; 復(fù)制代碼#GLKTextureInfo 使用GLKTextureLoader可以創(chuàng)建加載OpenGL紋理信息:
GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:nil error:nil];GLKTextureInfo有以下信息:GLuint name; //紋理名稱GLenum target; //紋理綁定的目標(biāo)GLuint width; //加載紋理的寬度GLuint height; //加載紋理的高度GLKTextureInfoAlphaState alphaState; //加載紋理中alpha狀態(tài)GLKTextureInfoOrigin textureOrigin; //加載紋理的原點(diǎn)位置BOOL containsMipmaps; //布爾值,加載的紋理是否包含mip貼圖 復(fù)制代碼#GLKBaseEffect GLKBaseEffect是OpenGL ES提供的一種簡(jiǎn)單的光照/著色系統(tǒng),用于基于著色器的渲染。 #####配置光照
//為基元兩側(cè)計(jì)算光照 (系統(tǒng)去做,開發(fā)者來(lái)控制開關(guān)) @property (nonatomic, assign) GLboolean lightModelTwoSided; //計(jì)算渲染圖元光照使?的材質(zhì)屬性 @property (nonatomic, readonly) GLKEffectPropertyMaterial *material; //環(huán)境顏?色,應(yīng)?用效果渲染的所有圖元 @property (nonatomic, assign) GLKVector4 lightModelAmbientColor;//第1、2、3個(gè)光照屬性 GLKEffectPropertyLight *_light0, *_light1, *_light2; 復(fù)制代碼#####配置紋理
//配置第1、2個(gè)紋理 GLKEffectPropertyTexture *_texture2d0, *_texture2d1; //紋理應(yīng)用于渲染圖元的順序 NSArray *_textureOrder; 復(fù)制代碼#####配置霧化
GLKEffectPropertyFog *_fog; 復(fù)制代碼#####配置顏色信息
//表示計(jì)算光照與材質(zhì)交互時(shí)是否使用顏色頂點(diǎn)屬性 @property (nonatomic, assign) GLboolean colorMaterialEnabled; //是否使用常量顏色 @property (nonatomic, assign) GLboolean useConstantColor; //不提供每個(gè)頂點(diǎn)顏色數(shù)據(jù)時(shí)使用常量顏? @property (nonatomic, assign) GLKVector4 constantColor; 復(fù)制代碼#####準(zhǔn)備繪制效果
- (void) prepareToDraw; //準(zhǔn)備繪制效果(必須在繪制前寫上) 復(fù)制代碼#下面演示使用GLKit來(lái)畫一個(gè)圖片到屏幕上
配置環(huán)境
//配置環(huán)境 - (void)setupUpEnv {//初始化上下文context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];if (context == nil) {NSLog(@"content create fail");return;}[EAGLContext setCurrentContext:context];//獲取GLKView 設(shè)置contextGLKView * view = (GLKView *)self.view;view.context = context;view.delegate = self;//配置視圖創(chuàng)建的渲染緩沖區(qū)view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;view.drawableDepthFormat = GLKViewDrawableDepthFormat24;//配置背景顏色glClearColor(0, 1, 1, 1); } 復(fù)制代碼###配置頂點(diǎn)數(shù)據(jù)
// 設(shè)置頂點(diǎn)數(shù)據(jù)數(shù)組(頂點(diǎn)坐標(biāo)、紋理坐標(biāo)) - (void)setUpVertexData {//頂點(diǎn)數(shù)據(jù)和紋理數(shù)據(jù)都存在一個(gè)數(shù)組中 ,6個(gè)頂點(diǎn),每五個(gè)數(shù)據(jù) 前三個(gè)為xyz頂點(diǎn)坐標(biāo) 后兩個(gè)為紋理坐標(biāo)stGLfloat vertexData [] = {0.6, -0.5, 0.0f, 1.0f, 0.0f, //右下0.6, 0.5, -0.0f, 1.0f, 1.0f, //右上-0.6, 0.5, 0.0f, 0.0f, 1.0f, //左上0.6, -0.5, 0.0f, 1.0f, 0.0f, //右下-0.6, 0.5, 0.0f, 0.0f, 1.0f, //左上-0.6, -0.5, 0.0f, 0.0f, 0.0f, //左下};//將頂點(diǎn)數(shù)據(jù)copyj到頂點(diǎn)緩沖區(qū) : 這樣做會(huì)提前分配一塊顯存,將頂點(diǎn)數(shù)據(jù)copy進(jìn)去,這樣可以性能更高GLuint bufferID;glGenBuffers(1, &bufferID); //創(chuàng)建頂點(diǎn)緩沖區(qū)的標(biāo)識(shí)符IDglBindBuffer(GL_ARRAY_BUFFER, bufferID); //綁定頂點(diǎn)緩沖區(qū)glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); //將頂點(diǎn)數(shù)據(jù)copy到頂點(diǎn)緩沖區(qū)/**打開讀取通道(默認(rèn)是關(guān)閉的,這一步是必須要寫的)方法簡(jiǎn)介 : 上傳頂點(diǎn)數(shù)據(jù)到顯存的方法(設(shè)置合適的方式從buffer里面讀取數(shù)據(jù))glVertexAttribPointer(GLuint indx , GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *ptr)* 參數(shù)列表:* indx :指定要修改的頂點(diǎn)屬性索引值 :比如 GLKVertexAttribPosition代表頂點(diǎn) GLKVertexAttribTexCoord0代表紋理* size :每次讀取的數(shù)量 (如position是由3個(gè)(x,y,z)組成,而顏色是4個(gè)(r,g,b,a),紋理則是2個(gè).)* type :指定數(shù)組中每個(gè)組件的數(shù)據(jù)類型。可用的有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOAT。* normalized :指定當(dāng)被訪問(wèn)時(shí),固定點(diǎn)數(shù)據(jù)值是否應(yīng)該被歸一化(GL_TRUE)或者直接轉(zhuǎn)換為固定點(diǎn)值(GL_FALSE)* stride :指定連續(xù)頂點(diǎn)屬性之間的偏移量。如果為0,那么頂點(diǎn)屬性會(huì)被理解為:它們是緊密排列在一起的。初始值為0* ptr :指定一個(gè)指針,指向數(shù)組中第一個(gè)屬性組件*///頂點(diǎn)坐標(biāo)數(shù)據(jù)glEnableVertexAttribArray(GLKVertexAttribPosition);/** 每次讀3個(gè)數(shù)據(jù),即x y z。 頂點(diǎn)偏移量為5:* 第一個(gè)頂點(diǎn)從下標(biāo)0開始,第二個(gè)頂點(diǎn)從下標(biāo)5開始,以此類推。。。* (GLfloat *)NULL + 0 :表示首次讀取的位置,因?yàn)榇藭r(shí)讀取是從顯存讀的 所以不能用數(shù)組地址去取 (GLfloat *)NULL表示首地址*/glVertexAttribPointer(GLKVertexAttribPosition , 3, GL_FLOAT,GL_FALSE, 5, (GLfloat *)NULL + 0);//紋理坐標(biāo)數(shù)據(jù)glEnableVertexAttribArray(GLKVertexAttribTexCoord0);glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 5, (GLfloat *)NULL + 3); } 復(fù)制代碼###配置頂點(diǎn)數(shù)據(jù)
//配置紋理 - (void)setUpTexture {NSString * filePath = [[NSBundle mainBundle] pathForResource:@"memory" ofType:@"jpg"];//因?yàn)榧y理坐標(biāo)和屏幕坐標(biāo)是需要翻轉(zhuǎn)的,所以這里需要配置一下映射關(guān)系NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@(1),GLKTextureLoaderOriginBottomLeft, nil];GLKTextureInfo * textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];//使用 GLKBaseEffect 完成著色器的工作cEffect = [[GLKBaseEffect alloc] init];cEffect.texture2d0.enabled = GL_TRUE;cEffect.texture2d0.name = textureInfo.name; } 復(fù)制代碼###GLKViewDelegate開始繪圖
#pragma mark - GLKViewDelegate - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {glClear(GL_COLOR_BUFFER_BIT);//重要的一步!!![cEffect prepareToDraw];//開始繪制glDrawArrays(GL_TRIANGLES, 0, 6); } 復(fù)制代碼###viewDidLoad里依次調(diào)用
[self setupUpEnv];[self setUpVertexData];[self setUpTexture]; 復(fù)制代碼運(yùn)行效果如下:
轉(zhuǎn)載于:https://juejin.im/post/5d22f34fe51d45598611b9d5
總結(jié)
以上是生活随笔為你收集整理的OpenGL ES GLKit初探的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux谷歌浏览器无法登陆,使用chr
- 下一篇: office2016打开PPT出现解决V