iOS OpenGL ES 旋转立方体
思路
- 立方体有6个面,由于OpenGL es的特性,每个面只能有两个三角形组成,一个三角形有三个顶点,在不考虑使用顶点索引的情况下,一共需要36个顶点
- 立方体,需要开启深度测试和光源着色器
- 旋转立方体,需要做矩阵变换,使用固定着色器的
baseEffect.transform.modelviewMatrix可以旋转矩阵
- 数据
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 旋转立方体相关推荐
- [jimmyzhouj 翻译] Nehe iOS OpenGL ES 2.0教程 --Lesson 02
http://jimmyzhouj.blog.51cto.com/2317513/883520 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任 ...
- IOS OpenGL ES GPUImage 滤色混合 GPUImageScreenBlendFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- IOS OpenGL ES GPUImage 图像缩放 GPUImageTransformFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- IOS OpenGL ES GPUImage 色彩加深混合 GPUImageColorBurnBlendFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- IOS OpenGL ES GPUImage 色度键混合 GPUImageChromaKeyBlendFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- IOS OpenGL ES GPUImage 遮罩混合 GPUImageMaskFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- IOS OpenGL ES GPUImage 柔光混合 GPUImageSoftLightBlendFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- IOS OpenGL ES GPUImage 色彩减淡混合 GPUImageColorDodgeBlendFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- IOS OpenGL ES GPUImage 排除混合 GPUImageExclusionBlendFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
最新文章
- BNUOJ34980方(芳)格(哥)取数(好坑)
- 自定义windows开机声音
- 北京 | 一场产品经理必听的实战交流会!
- 19岁中专学历是怎么在广州找到前端工作的?
- 1082 射击比赛 (20 分)
- idea创建多模块Springboot项目、导入多模块、删除多模块
- 汇编语言:实现大小写字母转换
- 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)
- 老板突然出现,游戏飞速隐藏,开源神器在手,摸鱼不怕被抓包丨不会写代码也能用...
- 2018Web前端面试题及答案大全
- 使用GLSurfaceView实现涂鸦画板功能
- 如何在微信小程序中使用iconfont 1
- 电脑换新季让我终于脱离了盗版屌丝群
- php采集 今日头条链接,火车头按作者采集今日头条全部文章的方法
- html文本阴影水平垂直,CSS中使用文本阴影与元素阴影效果
- Tampermonkey 高级API的使用 附Demo
- mysql建库、建表命令、sql语句大全
- sqlserver中的CAST()函数
- 话费接口API优惠充值源码分享
- 赛卓电子冲刺科创板上市:计划募资11亿元,股东包括尚颀资本等
热门文章
- 推荐一个mac文本文件夹文件的对比工具
- 【搜狐科技】HIS、PACS、CIS、RIS、LIS(下)
- Altium Designer 18 速成实战 第二部分 元件库(原理图库)创建 (一)元件符号的概述
- java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~SSM项目错误集锦Part3(项目蹦+pg数据库坏+100%-->线上故障排查经验【业务bug第一步一定是先看日志,写好日志】)~整起
- paip 网站扫描安全工具hp WebInspect 使用指南
- java vector的排序_java Vector排序及用法
- win10下载DEVC++5.11
- RSA签名解签 - 前端JSEncrypt库、jsrsasign库和后端UE4使用Crypto++互相加解签
- SQL入门之第十讲——INNER JOIN 内连接
- 如何利用利用Processing Modflow软件建立地下水-地面沉降数值模型