思路

  • 立方体有6个面,由于OpenGL es的特性,每个面只能有两个三角形组成,一个三角形有三个顶点,在不考虑使用顶点索引的情况下,一共需要36个顶点
  • 立方体,需要开启深度测试和光源着色器
  • 旋转立方体,需要做矩阵变换,使用固定着色器的
    baseEffect.transform.modelviewMatrix可以旋转矩阵
  1. 数据
typedef struct {GLKVector3 positionCoord;   //顶点坐标GLKVector2 textureCoord;    //纹理坐标GLKVector3 normal ; //法线,与光源相关,法线是垂直于两个向量的向量,
} LLVertex;

需要的属性

@property(nonatomic,strong) GLKView *glkView;//渲染OpenGL的View@property(nonatomic,strong) GLKBaseEffect *baseEffect;// 固定着色器@property(nonatomic,assign) LLVertex *vertices; //顶点指针@property(nonatomic,strong) CADisplayLink *displayLink;@property(nonatomic,assign) NSInteger angle; // 旋转角度@property (nonatomic, assign) GLuint vertexBuffer; //顶点缓冲区id

步骤
1.初始化context、顶点、glkView、官员等
2.添加定时器、更新角度,并进行矩阵变换

#import "ViewController.h"
#import <GLKit/GLKit.h>typedef struct {GLKVector3 positionCoord;   //顶点坐标GLKVector2 textureCoord;    //纹理坐标GLKVector3 normal ; //法线,光照
} LLVertex;static NSInteger const kCoordCount = 36;@interface ViewController ()<GLKViewDelegate>@property(nonatomic,strong) GLKView *glkView;@property(nonatomic,strong) GLKBaseEffect *baseEffect;// 固定着色器@property(nonatomic,assign) LLVertex *vertices;@property(nonatomic,strong) CADisplayLink *displayLink;@property(nonatomic,assign) NSInteger angle;@property (nonatomic, assign) GLuint vertexBuffer;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[self commonInit];[self addCADisplayLink];
}-(void)commonInit{//设置上下文EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];[EAGLContext setCurrentContext:context];//创建GLKView并设置代理CGRect frame = CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.size.width);self.glkView = [[GLKView alloc] initWithFrame:frame context:context];self.glkView.backgroundColor = [UIColor clearColor];self.glkView.delegate = self;self.glkView.drawableDepthFormat = GLKViewDrawableDepthFormat24;glDepthRangef(1, 0);[self.view addSubview:self.glkView];NSString *imagePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"lufei.jpg"];UIImage *image = [UIImage imageWithContentsOfFile:imagePath];//设置纹理参数NSDictionary *options = @{GLKTextureLoaderOriginBottomLeft : @(YES)};//倒转图片GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithCGImage:[image CGImage]options:optionserror:NULL];//初始化固定着色器self.baseEffect = [[GLKBaseEffect alloc] init];//传入纹理到固定着色器self.baseEffect.texture2d0.name = textureInfo.name;self.baseEffect.texture2d0.target = textureInfo.target;//开启光源self.baseEffect.light0.enabled = YES;self.baseEffect.light0.diffuseColor = GLKVector4Make(1, 1, 1, 1);//漫反射self.baseEffect.light0.position = GLKVector4Make(-0.5, -0.5, 5, 1);//光源位置//开辟顶点空间self.vertices = malloc(sizeof(LLVertex)* kCoordCount);// 前面self.vertices[0] = (LLVertex){{-0.5, 0.5, 0.5}, {0, 1}, {0, 0, 1}};self.vertices[1] = (LLVertex){{-0.5, -0.5, 0.5}, {0, 0}, {0, 0, 1}};self.vertices[2] = (LLVertex){{0.5, 0.5, 0.5}, {1, 1}, {0, 0, 1}};self.vertices[3] = (LLVertex){{-0.5, -0.5, 0.5}, {0, 0}, {0, 0, 1}};self.vertices[4] = (LLVertex){{0.5, 0.5, 0.5}, {1, 1}, {0, 0, 1}};self.vertices[5] = (LLVertex){{0.5, -0.5, 0.5}, {1, 0}, {0, 0, 1}};// 上面self.vertices[6] = (LLVertex){{0.5, 0.5, 0.5}, {1, 1}, {0, 1, 0}};self.vertices[7] = (LLVertex){{-0.5, 0.5, 0.5}, {0, 1}, {0, 1, 0}};self.vertices[8] = (LLVertex){{0.5, 0.5, -0.5}, {1, 0}, {0, 1, 0}};self.vertices[9] = (LLVertex){{-0.5, 0.5, 0.5}, {0, 1}, {0, 1, 0}};self.vertices[10] = (LLVertex){{0.5, 0.5, -0.5}, {1, 0}, {0, 1, 0}};self.vertices[11] = (LLVertex){{-0.5, 0.5, -0.5}, {0, 0}, {0, 1, 0}};// 下面self.vertices[12] = (LLVertex){{0.5, -0.5, 0.5}, {1, 1}, {0, -1, 0}};self.vertices[13] = (LLVertex){{-0.5, -0.5, 0.5}, {0, 1}, {0, -1, 0}};self.vertices[14] = (LLVertex){{0.5, -0.5, -0.5}, {1, 0}, {0, -1, 0}};self.vertices[15] = (LLVertex){{-0.5, -0.5, 0.5}, {0, 1}, {0, -1, 0}};self.vertices[16] = (LLVertex){{0.5, -0.5, -0.5}, {1, 0}, {0, -1, 0}};self.vertices[17] = (LLVertex){{-0.5, -0.5, -0.5}, {0, 0}, {0, -1, 0}};// 左面self.vertices[18] = (LLVertex){{-0.5, 0.5, 0.5}, {1, 1}, {-1, 0, 0}};self.vertices[19] = (LLVertex){{-0.5, -0.5, 0.5}, {0, 1}, {-1, 0, 0}};self.vertices[20] = (LLVertex){{-0.5, 0.5, -0.5}, {1, 0}, {-1, 0, 0}};self.vertices[21] = (LLVertex){{-0.5, -0.5, 0.5}, {0, 1}, {-1, 0, 0}};self.vertices[22] = (LLVertex){{-0.5, 0.5, -0.5}, {1, 0}, {-1, 0, 0}};self.vertices[23] = (LLVertex){{-0.5, -0.5, -0.5}, {0, 0}, {-1, 0, 0}};// 右面self.vertices[24] = (LLVertex){{0.5, 0.5, 0.5}, {1, 1}, {1, 0, 0}};self.vertices[25] = (LLVertex){{0.5, -0.5, 0.5}, {0, 1}, {1, 0, 0}};self.vertices[26] = (LLVertex){{0.5, 0.5, -0.5}, {1, 0}, {1, 0, 0}};self.vertices[27] = (LLVertex){{0.5, -0.5, 0.5}, {0, 1}, {1, 0, 0}};self.vertices[28] = (LLVertex){{0.5, 0.5, -0.5}, {1, 0}, {1, 0, 0}};self.vertices[29] = (LLVertex){{0.5, -0.5, -0.5}, {0, 0}, {1, 0, 0}};// 后面self.vertices[30] = (LLVertex){{-0.5, 0.5, -0.5}, {0, 1}, {0, 0, -1}};self.vertices[31] = (LLVertex){{-0.5, -0.5, -0.5}, {0, 0}, {0, 0, -1}};self.vertices[32] = (LLVertex){{0.5, 0.5, -0.5}, {1, 1}, {0, 0, -1}};self.vertices[33] = (LLVertex){{-0.5, -0.5, -0.5}, {0, 0}, {0, 0, -1}};self.vertices[34] = (LLVertex){{0.5, 0.5, -0.5}, {1, 1}, {0, 0, -1}};self.vertices[35] = (LLVertex){{0.5, -0.5, -0.5}, {1, 0}, {0, 0, -1}};//顶点数据传入GPUglGenBuffers(1, &_vertexBuffer);glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);glBufferData(GL_ARRAY_BUFFER, sizeof(LLVertex) * kCoordCount, self.vertices, GL_STATIC_DRAW);//纹理坐标传入GPUglEnableVertexAttribArray(GLKVertexAttribPosition);glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(LLVertex), NULL + offsetof(LLVertex, positionCoord));//纹理传入GPUglEnableVertexAttribArray(GLKVertexAttribTexCoord0);glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(LLVertex), NULL + offsetof(LLVertex, textureCoord));//法向量传入GPUglEnableVertexAttribArray(GLKVertexAttribNormal);glVertexAttribPointer(GLKVertexAttribNormal,3,GL_FLOAT,GL_FALSE,sizeof(LLVertex),NULL + offsetof(LLVertex, normal));}-(void) addCADisplayLink{self.angle = 0;self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];[self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}-(void)update{self.angle = ( self.angle + 1) % 360;self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeRotation(GLKMathDegreesToRadians(self.angle), 0.3, 1, 0.7);[self.glkView display];
}- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);[self.baseEffect prepareToDraw];glDrawArrays(GL_TRIANGLES, 0, kCoordCount);
}- (void)dealloc {if ([EAGLContext currentContext] == self.glkView.context) {[EAGLContext setCurrentContext:nil];}if (_vertices) {free(_vertices);_vertices = nil;}if (_vertexBuffer) {glDeleteBuffers(1, &_vertexBuffer);_vertexBuffer = 0;}//displayLink 失效[self.displayLink invalidate];
}@end


Demo地址

iOS OpenGL ES 旋转立方体相关推荐

  1. [jimmyzhouj 翻译] Nehe iOS OpenGL ES 2.0教程 --Lesson 02

    http://jimmyzhouj.blog.51cto.com/2317513/883520 原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 .作者信息和本声明.否则将追究法律责任 ...

  2. IOS OpenGL ES GPUImage 滤色混合 GPUImageScreenBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  3. IOS OpenGL ES GPUImage 图像缩放 GPUImageTransformFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  4. IOS OpenGL ES GPUImage 色彩加深混合 GPUImageColorBurnBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  5. IOS OpenGL ES GPUImage 色度键混合 GPUImageChromaKeyBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  6. IOS OpenGL ES GPUImage 遮罩混合 GPUImageMaskFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  7. IOS OpenGL ES GPUImage 柔光混合 GPUImageSoftLightBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  8. IOS OpenGL ES GPUImage 色彩减淡混合 GPUImageColorDodgeBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  9. IOS OpenGL ES GPUImage 排除混合 GPUImageExclusionBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

最新文章

  1. BNUOJ34980方(芳)格(哥)取数(好坑)
  2. 自定义windows开机声音
  3. 北京 | 一场产品经理必听的实战交流会!
  4. 19岁中专学历是怎么在广州找到前端工作的?
  5. 1082 射击比赛 (20 分)
  6. idea创建多模块Springboot项目、导入多模块、删除多模块
  7. 汇编语言:实现大小写字母转换
  8. 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)
  9. 老板突然出现,游戏飞速隐藏,开源神器在手,摸鱼不怕被抓包丨不会写代码也能用...
  10. 2018Web前端面试题及答案大全
  11. 使用GLSurfaceView实现涂鸦画板功能
  12. 如何在微信小程序中使用iconfont 1
  13. 电脑换新季让我终于脱离了盗版屌丝群
  14. php采集 今日头条链接,火车头按作者采集今日头条全部文章的方法
  15. html文本阴影水平垂直,CSS中使用文本阴影与元素阴影效果
  16. Tampermonkey 高级API的使用 附Demo
  17. mysql建库、建表命令、sql语句大全
  18. sqlserver中的CAST()函数
  19. 话费接口API优惠充值源码分享
  20. 赛卓电子冲刺科创板上市:计划募资11亿元,股东包括尚颀资本等

热门文章

  1. 推荐一个mac文本文件夹文件的对比工具
  2. 【搜狐科技】HIS、PACS、CIS、RIS、LIS(下)
  3. Altium Designer 18 速成实战 第二部分 元件库(原理图库)创建 (一)元件符号的概述
  4. java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~SSM项目错误集锦Part3(项目蹦+pg数据库坏+100%-->线上故障排查经验【业务bug第一步一定是先看日志,写好日志】)~整起
  5. paip 网站扫描安全工具hp WebInspect 使用指南
  6. java vector的排序_java Vector排序及用法
  7. win10下载DEVC++5.11
  8. RSA签名解签 - 前端JSEncrypt库、jsrsasign库和后端UE4使用Crypto++互相加解签
  9. SQL入门之第十讲——INNER JOIN 内连接
  10. 如何利用利用Processing Modflow软件建立地下水-地面沉降数值模型