博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用OpenGL绘制简易三角形
阅读量:6623 次
发布时间:2019-06-25

本文共 2325 字,大约阅读时间需要 7 分钟。

#import"ViewController.h"

@interface ViewController()

@property(nonatomic,strong)EAGLContext * mContext;// OpenGL的上下文

@property(nonatomic,strong)GLKBaseEffect * mEffect;// OpenGL的着色器

@property(nonatomic,assign)int mCount;

@end

创建OpenGL的上下文和着色器

(1)创建OpenGL上下文

self.mContext= [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];//2.0,还有1.0和3.0

GLKView* view = (GLKView*)self.view;//storyboard记得添加

view.context=self.mContext;

view.drawableColorFormat=GLKViewDrawableColorFormatRGBA8888;//颜色缓冲区格式

[EAGLContext setCurrentContext:self.mContext];

(2)创建顶点数据

//顶点数据,前三个是顶点坐标,后面两个是纹理坐标

GLfloat squareVertexData[] =

{

0.5, -0.5,0.0f,1.0f,0.0f,//右下

-0.5,0.5,0.0f,0.0f,1.0f,//左上

-0.5, -0.5,0.0f,0.0f,0.0f,//左下

//0.5, 0.5, -0.0f,1.0f, 1.0f, //右上

};

//顶点索引,数组中的每三个代表了顶点数组中的顶点比如0,1,2表示取得是0.5, -0.5,0.0f,1.0f,0.0f,//右下,-0.5,0.5,0.0f,0.0f,1.0f,//左上,-0.5, -0.5,0.0f,0.0f,0.0f,//左下这三个点

GLuint indices[] =

{

0,1,2,

//1, 3, 0

};

self.mCount=sizeof(indices) /sizeof(GLuint);

//顶点数据缓存

GLuint buffer;// 

glGenBuffers(1, &buffer);// OpenGL为图形处理器控制的缓存生成一个独一无二的标识符

glBindBuffer(GL_ARRAY_BUFFER, buffer);// 为接下来的运算使用一个缓存

glBufferData(GL_ARRAY_BUFFER,sizeof(squareVertexData), squareVertexData,GL_STATIC_DRAW);// 为当前的缓存分配并初始化足够的连续内存

// 顶点索引缓存

GLuint index;

glGenBuffers(1, &index);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);

glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices), indices,GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);// 告诉OpenGL是否使用缓存中的数据

glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,sizeof(GLfloat) *5, (GLfloat*)NULL+0);// 告诉OpenGL在缓存中数据的类型和所需要访问数据的偏移量

//纹理贴图

NSString* filePath = [[NSBundlemainBundle]pathForResource:@"for_test"ofType:@"jpg"];

NSDictionary* options = [NSDictionarydictionaryWithObjectsAndKeys:@(1),GLKTextureLoaderOriginBottomLeft,nil];//GLKTextureLoaderOriginBottomLeft纹理坐标系是相反的

GLKTextureInfo* textureInfo = [GLKTextureLoadertextureWithContentsOfFile:filePathoptions:optionserror:nil];

//着色器

self.mEffect= [[GLKBaseEffectalloc]init];

self.mEffect.texture2d0.enabled=GL_TRUE;

self.mEffect.texture2d0.name= textureInfo.name;

- (void)glkView:(GLKView*)view drawInRect:(CGRect)rect {

glClearColor(0.3f,0.6f,0.5f,1.0f);

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

//启动着色器

[self.mEffect prepareToDraw];

glDrawElements(GL_TRIANGLES,self.mCount,GL_UNSIGNED_INT,0);

}

转载地址:http://xtjpo.baihongyu.com/

你可能感兴趣的文章
索罗斯的反身理论和汇率分析
查看>>
Linux登录那点事
查看>>
angular项目中bootstrap-datetimepicker时间插件的使用
查看>>
通过网络仓库建立本地的yum仓库
查看>>
【web端权限维持】利用ADS隐藏webshell
查看>>
Linux下gdb的安装及使用入门
查看>>
Java 程序执行过程的内存分析
查看>>
灾难恢复-boot分区的恢复方法
查看>>
小游戏-猜数字
查看>>
深度学习到顶,AI寒冬将至!
查看>>
【投资】欧盟区块链创业公司投资超500万欧元
查看>>
优傲机器人:人机协作机器人助推电子制造业智慧升级
查看>>
PHP浮点数的精确计算BCMath
查看>>
[起重机监测系统] 1、基于无线传输的桥式起重机的安全监测方案
查看>>
2014年发展计划
查看>>
QQ协议
查看>>
[Android]一个干净的架构(翻译)
查看>>
Oracle RAC安装过程中碰到的“坑”和关键点(一)
查看>>
Jmeter关联
查看>>
java的nio之:java的nio系列教程之Scatter/Gather
查看>>