怎么在ios开发中使用opengl
1个回答
展开全部
一、搭建开发环境
1. 打开Xcode, 新建一个工程
选择:IOS -> Application -> Single View Application模板
输入工程名称和基本信息,勾选“UseStoryboards”,然后创建
2. 添加必要的框架
在“Build Phases”中,添加三个框架
3. 修改viewController。h
添加 “#import”,并将它修改为继承"GLKViewController"
4. 修改“view”的类
双击“MainStoryboard.storyboard”展开,选择"view"
然后,在“Identity Inspector"中,将它的类改为”GLKView“
好了,OpenGL的环境基本上搭建出来了。
二、增加自己代码
基本上,所有的代码都是加到ViewController.m文件中
1、添加全局属性声明
@interface ViewController ()@property(strong,nonatomic)EAGLContext*
context;@property(strong,nonatomic)GLKBaseEffect* effect;@end@implementation
ViewController@synthesize context, effect;
2、 添加一组顶点数据
这是一个正方形顶点数组。实际上它是二个三角形接合而成的
GLfloat squareVertexData[48] ={ 0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f,
1.0f, -0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f, -0.5f, -0.9f,
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f, -0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, -0.5f, -0.5f, -0.9f, 0.0f,
0.0f, 1.0f, 1.0f, 1.0f,};
每行顶点数据的排列含义是:
顶点X、顶点Y,顶点Z、法线X、法线Y、法线Z、纹理S、纹理T。
在后面解析此数组时,将参考此规则。
顶点位置用于确定在什么地方显示,法线用于光照模型计算,纹理则用在贴图中。
一般约定为“顶点以逆时针次序出现在屏幕上的面”为“正面”。
世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。
三、初始化OpenGL环境
1、 基本的初始化代码
在ViewController.m中有个函数(void)viewDidLoad,它是程序运行时,初始化回调函数。在viewDidLoad函数内补充我们自己的初始化代码。
// 使用“ES2”创建一个“EAGLEContext”实例 self.context = [[[EAGLContext
alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]autorelease]; //
将“view”的context设置为这个“EAGLContext”实例的引用。并且设置颜色格式和深度格式。 GLKView* view =
(GLKView*)self.view; view.context = self.context; view.drawableColorFormat =
GLKViewDrawableColorFormatRGBA8888; view.drawableDepthFormat =
GLKViewDrawableDepthFormat24; //
将此“EAGLContext”实例设置为OpenGL的“当前激活”的“Context”。这样,以后所有“GL”的指令均作用在这个“Context”上。随后,发送第一个“GL”指令:激活“深度检测”。
[EAGLContext setCurrentContext:context]; glEnable(GL_DEPTH_TEST); //
创建一个GLK内置的“着色效果”,并给它提供一个光源,光的颜色为绿色。 self.effect = [[[GLKBaseEffect
alloc]init]autorelease]; self.effect.light0.enabled = GL_TRUE;
self.effect.light0.diffuseColor = GLKVector4Make(0.0f, 1.0f, 0.0f, 1.0f);
2、 运行。现在应该是粉红色屏幕了(目前场景仍是空的),说明初始化过程没问题
四、 将项点数据写入能用的顶点属性存储区
1、 写入过程
首先将数据保存进GUP的一个缓冲区中,然后再按一定规则,将数据取出,复制到各个通用顶点属性中。
注:如果顶点数据只有一种类型(如单纯的位置坐标),换言之,在读数据时,不需要确定第一个数据的内存位置(总是从0开始),则不必事先保存进缓冲区。
2、 顶点数组保存进缓冲区
//
声明一个缓冲区的标识(GLuint类型)让OpenGL自动分配一个缓冲区并且返回这个标识的值.绑定这个缓冲区到当前“Context”.最后,将我们前面预先定义的顶点数据“squareVertexData”复制进这个缓冲区中。
// 注:参数“GL_STATIC_DRAW”,它表示此缓冲区内容只能被修改一次,但可以无限次读取。 GLuint buffer;
glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertexData), squareVertexData,
GL_STATIC_DRAW);
3、将缓冲区的数据复制进能用顶点属性中
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8,
(char*)NULL + 0);
首先,激活顶点属性(默认它的关闭的)。“GLKVertexAttribPosition”是顶点属性集中“位置Position”属性的索引。
顶点属性集中包含五种属性:位置、法线、颜色、纹理0,纹理1。
它们的索引值是0到4。
激活后,接下来使用“glVertexAttribPointer”方法填充数据。
1. 打开Xcode, 新建一个工程
选择:IOS -> Application -> Single View Application模板
输入工程名称和基本信息,勾选“UseStoryboards”,然后创建
2. 添加必要的框架
在“Build Phases”中,添加三个框架
3. 修改viewController。h
添加 “#import”,并将它修改为继承"GLKViewController"
4. 修改“view”的类
双击“MainStoryboard.storyboard”展开,选择"view"
然后,在“Identity Inspector"中,将它的类改为”GLKView“
好了,OpenGL的环境基本上搭建出来了。
二、增加自己代码
基本上,所有的代码都是加到ViewController.m文件中
1、添加全局属性声明
@interface ViewController ()@property(strong,nonatomic)EAGLContext*
context;@property(strong,nonatomic)GLKBaseEffect* effect;@end@implementation
ViewController@synthesize context, effect;
2、 添加一组顶点数据
这是一个正方形顶点数组。实际上它是二个三角形接合而成的
GLfloat squareVertexData[48] ={ 0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f,
1.0f, -0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f, -0.5f, -0.9f,
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f, -0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, -0.5f, -0.5f, -0.9f, 0.0f,
0.0f, 1.0f, 1.0f, 1.0f,};
每行顶点数据的排列含义是:
顶点X、顶点Y,顶点Z、法线X、法线Y、法线Z、纹理S、纹理T。
在后面解析此数组时,将参考此规则。
顶点位置用于确定在什么地方显示,法线用于光照模型计算,纹理则用在贴图中。
一般约定为“顶点以逆时针次序出现在屏幕上的面”为“正面”。
世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。
三、初始化OpenGL环境
1、 基本的初始化代码
在ViewController.m中有个函数(void)viewDidLoad,它是程序运行时,初始化回调函数。在viewDidLoad函数内补充我们自己的初始化代码。
// 使用“ES2”创建一个“EAGLEContext”实例 self.context = [[[EAGLContext
alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]autorelease]; //
将“view”的context设置为这个“EAGLContext”实例的引用。并且设置颜色格式和深度格式。 GLKView* view =
(GLKView*)self.view; view.context = self.context; view.drawableColorFormat =
GLKViewDrawableColorFormatRGBA8888; view.drawableDepthFormat =
GLKViewDrawableDepthFormat24; //
将此“EAGLContext”实例设置为OpenGL的“当前激活”的“Context”。这样,以后所有“GL”的指令均作用在这个“Context”上。随后,发送第一个“GL”指令:激活“深度检测”。
[EAGLContext setCurrentContext:context]; glEnable(GL_DEPTH_TEST); //
创建一个GLK内置的“着色效果”,并给它提供一个光源,光的颜色为绿色。 self.effect = [[[GLKBaseEffect
alloc]init]autorelease]; self.effect.light0.enabled = GL_TRUE;
self.effect.light0.diffuseColor = GLKVector4Make(0.0f, 1.0f, 0.0f, 1.0f);
2、 运行。现在应该是粉红色屏幕了(目前场景仍是空的),说明初始化过程没问题
四、 将项点数据写入能用的顶点属性存储区
1、 写入过程
首先将数据保存进GUP的一个缓冲区中,然后再按一定规则,将数据取出,复制到各个通用顶点属性中。
注:如果顶点数据只有一种类型(如单纯的位置坐标),换言之,在读数据时,不需要确定第一个数据的内存位置(总是从0开始),则不必事先保存进缓冲区。
2、 顶点数组保存进缓冲区
//
声明一个缓冲区的标识(GLuint类型)让OpenGL自动分配一个缓冲区并且返回这个标识的值.绑定这个缓冲区到当前“Context”.最后,将我们前面预先定义的顶点数据“squareVertexData”复制进这个缓冲区中。
// 注:参数“GL_STATIC_DRAW”,它表示此缓冲区内容只能被修改一次,但可以无限次读取。 GLuint buffer;
glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertexData), squareVertexData,
GL_STATIC_DRAW);
3、将缓冲区的数据复制进能用顶点属性中
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8,
(char*)NULL + 0);
首先,激活顶点属性(默认它的关闭的)。“GLKVertexAttribPosition”是顶点属性集中“位置Position”属性的索引。
顶点属性集中包含五种属性:位置、法线、颜色、纹理0,纹理1。
它们的索引值是0到4。
激活后,接下来使用“glVertexAttribPointer”方法填充数据。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询