日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL ES GLKit初探

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL ES GLKit初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#GLKit框架 GLKit框架的設計目的是為了簡化OpenGL/OpenGL ES的應用開發。它的出現加快了OpenGL或OpenGL ES應用程序的開發。使用數學庫、背景紋理加載,預先創建著色器效果,以及標準視圖和視圖控制器來實現渲染循環。 GLKit框架提供了功能和類,可以減少創建新的基于著色器的應?程序所需的?作量, 或者支持依賴早期版本的OpenGL ES或OpenGL提供的固定函數頂點或?段處理的現有 應用程序。

#GLKView 、GLKViewController 在iOS平臺下,蘋果給我們封裝好了GLKViewController這樣的一個類,簡化了我們通過OpenGL ES渲染圖形的工作。

//初始化GLKView - (instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;//顏色渲染緩沖區格式 @property (nonatomic) GLKViewDrawableColorFormat drawableColorFormat;//深度渲染緩沖區格式 @property (nonatomic) GLKViewDrawableDepthFormat drawableDepthFormat;//模板渲染緩沖區格式 @property (nonatomic) GLKViewDrawableStencilFormat drawableStencilFormat;//多重采樣緩沖區格式 @property (nonatomic) GLKViewDrawableMultisample drawableMultisample;//幀緩沖區屬性 @property (nonatomic, readonly) NSInteger drawableWidth; //緩沖區對象寬度 @property (nonatomic, readonly) NSInteger drawableHeight; //緩沖區對象高度/** * GLKViewDelegate必須實現的方法:在這個方法里進行繪圖 * - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect; */ @property (nullable, nonatomic, assign) IBOutlet id <GLKViewDelegate> delegate;//將底層的FrameBuffer對象綁定到OpenGL ES - (void)bindDrawable;//刪除視圖FrameBuffer對象 - (void)deleteDrawable;//繪制視圖內容并將其作為圖像對象返回 @property (readonly, strong) UIImage *snapshot;//布爾,指定視圖是否響應使得視圖內容無效的信息 @property (nonatomic) BOOL enableSetNeedsDisplay;//立即重繪 - (void)display; 復制代碼

#GLKTextureInfo 使用GLKTextureLoader可以創建加載OpenGL紋理信息:

GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:nil error:nil];GLKTextureInfo有以下信息:GLuint name; //紋理名稱GLenum target; //紋理綁定的目標GLuint width; //加載紋理的寬度GLuint height; //加載紋理的高度GLKTextureInfoAlphaState alphaState; //加載紋理中alpha狀態GLKTextureInfoOrigin textureOrigin; //加載紋理的原點位置BOOL containsMipmaps; //布爾值,加載的紋理是否包含mip貼圖 復制代碼

#GLKBaseEffect GLKBaseEffect是OpenGL ES提供的一種簡單的光照/著色系統,用于基于著色器的渲染。 #####配置光照

//為基元兩側計算光照 (系統去做,開發者來控制開關) @property (nonatomic, assign) GLboolean lightModelTwoSided; //計算渲染圖元光照使?的材質屬性 @property (nonatomic, readonly) GLKEffectPropertyMaterial *material; //環境顏?色,應?用效果渲染的所有圖元 @property (nonatomic, assign) GLKVector4 lightModelAmbientColor;//第1、2、3個光照屬性 GLKEffectPropertyLight *_light0, *_light1, *_light2; 復制代碼

#####配置紋理

//配置第1、2個紋理 GLKEffectPropertyTexture *_texture2d0, *_texture2d1; //紋理應用于渲染圖元的順序 NSArray *_textureOrder; 復制代碼

#####配置霧化

GLKEffectPropertyFog *_fog; 復制代碼

#####配置顏色信息

//表示計算光照與材質交互時是否使用顏色頂點屬性 @property (nonatomic, assign) GLboolean colorMaterialEnabled; //是否使用常量顏色 @property (nonatomic, assign) GLboolean useConstantColor; //不提供每個頂點顏色數據時使用常量顏? @property (nonatomic, assign) GLKVector4 constantColor; 復制代碼

#####準備繪制效果

- (void) prepareToDraw; //準備繪制效果(必須在繪制前寫上) 復制代碼

#下面演示使用GLKit來畫一個圖片到屏幕上

配置環境

//配置環境 - (void)setupUpEnv {//初始化上下文context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];if (context == nil) {NSLog(@"content create fail");return;}[EAGLContext setCurrentContext:context];//獲取GLKView 設置contextGLKView * view = (GLKView *)self.view;view.context = context;view.delegate = self;//配置視圖創建的渲染緩沖區view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;view.drawableDepthFormat = GLKViewDrawableDepthFormat24;//配置背景顏色glClearColor(0, 1, 1, 1); } 復制代碼

###配置頂點數據

// 設置頂點數據數組(頂點坐標、紋理坐標) - (void)setUpVertexData {//頂點數據和紋理數據都存在一個數組中 ,6個頂點,每五個數據 前三個為xyz頂點坐標 后兩個為紋理坐標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, //左下};//將頂點數據copyj到頂點緩沖區 : 這樣做會提前分配一塊顯存,將頂點數據copy進去,這樣可以性能更高GLuint bufferID;glGenBuffers(1, &bufferID); //創建頂點緩沖區的標識符IDglBindBuffer(GL_ARRAY_BUFFER, bufferID); //綁定頂點緩沖區glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); //將頂點數據copy到頂點緩沖區/**打開讀取通道(默認是關閉的,這一步是必須要寫的)方法簡介 : 上傳頂點數據到顯存的方法(設置合適的方式從buffer里面讀取數據)glVertexAttribPointer(GLuint indx , GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *ptr)* 參數列表:* indx :指定要修改的頂點屬性索引值 :比如 GLKVertexAttribPosition代表頂點 GLKVertexAttribTexCoord0代表紋理* size :每次讀取的數量 (如position是由3個(x,y,z)組成,而顏色是4個(r,g,b,a),紋理則是2個.)* type :指定數組中每個組件的數據類型。可用的有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOAT。* normalized :指定當被訪問時,固定點數據值是否應該被歸一化(GL_TRUE)或者直接轉換為固定點值(GL_FALSE)* stride :指定連續頂點屬性之間的偏移量。如果為0,那么頂點屬性會被理解為:它們是緊密排列在一起的。初始值為0* ptr :指定一個指針,指向數組中第一個屬性組件*///頂點坐標數據glEnableVertexAttribArray(GLKVertexAttribPosition);/** 每次讀3個數據,即x y z。 頂點偏移量為5:* 第一個頂點從下標0開始,第二個頂點從下標5開始,以此類推。。。* (GLfloat *)NULL + 0 :表示首次讀取的位置,因為此時讀取是從顯存讀的 所以不能用數組地址去取 (GLfloat *)NULL表示首地址*/glVertexAttribPointer(GLKVertexAttribPosition , 3, GL_FLOAT,GL_FALSE, 5, (GLfloat *)NULL + 0);//紋理坐標數據glEnableVertexAttribArray(GLKVertexAttribTexCoord0);glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 5, (GLfloat *)NULL + 3); } 復制代碼

###配置頂點數據

//配置紋理 - (void)setUpTexture {NSString * filePath = [[NSBundle mainBundle] pathForResource:@"memory" ofType:@"jpg"];//因為紋理坐標和屏幕坐標是需要翻轉的,所以這里需要配置一下映射關系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; } 復制代碼

###GLKViewDelegate開始繪圖

#pragma mark - GLKViewDelegate - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {glClear(GL_COLOR_BUFFER_BIT);//重要的一步!!![cEffect prepareToDraw];//開始繪制glDrawArrays(GL_TRIANGLES, 0, 6); } 復制代碼

###viewDidLoad里依次調用

[self setupUpEnv];[self setUpVertexData];[self setUpTexture]; 復制代碼

運行效果如下:

轉載于:https://juejin.im/post/5d22f34fe51d45598611b9d5

總結

以上是生活随笔為你收集整理的OpenGL ES GLKit初探的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。