自定义ViewController中存在两组方法,第一组为:
viewDidLoad;
viewDidUnload;
didReceiveMemoryWarning
shouldAutorotateToInterfaceOrientation
这组方法为view的通用方法,方法的定义在UIViewController接口中。
第二组为:
update
drawInRect
setupGL
tearDownGL
loadShaders
compileShader
linkProgram
validateProgram
这组方法为利用opengl绘图。其中update、drawInRect方法为系统回调方法,其余为opengl的基础操作方法。如图1所示,跟踪程序发现,整个架构底层是一个timer,定时调用GLKViewController的 _updateAndDraw方法,而在_updateAndDraw方法中会依次调用到drawInRect和update方法。其中drawInRect方法的主要逻辑是绘图,并返回一个 GLKView;update方法主要用于更新游戏信息;其中drawInRect方法也可以在自定义的view中实现,这样应该至少可以方便地实现同一游戏逻辑下可以使用不同的渲染效果。
图1
第二组的其余方法揭示了opengl的基本使用方法:
1.EAGLContext 是包含opengl绘图时所涉及到的状态信息、命令、资源的上下文环境。从代码中看,程序把生成的EAGLContext先后挂接到GLKView和opengl层,挂接的方法分别是
GLKView *view = (GLKView *)self.view;
view.context = self.context;
[EAGLContext setCurrentContext:self.context];
2.代码中展示了两种opengl渲染方式,一种是使用GLKit渲染,另一种是使用ES2。
使用GLKit渲染的核心想法是使用GLKBaseEffect简化对opengl的调用,你可以通过GLKBaseEffect的若干属性对渲染方式进行设定,并在使用opengl渲染之前调用如下方法
[self.effect prepareToDraw];
ES2方式是基于GLSL的,它可以动态加载、编译、执行GLSL编写的渲染脚本,其大致的调用顺序如下:
1)创建程序对象
通过glCreateProgram创建程序对象。
2)编译shader
通过glCreateShader创建一个shader对象
读取shaker脚本内容,并通过glShaderSource把内容与之前创建的shader对象关联上,读取文件内容可以通过stringWithContentsOfFile方法实现。
通过glCompileShader方法编译shader。
通过glGetShaderiv,传入GL_COMPILE_STATUS参数可以查看编译状态。
3)链接shader
使用glLinkProgram方法可以链接shader程序。
在链接shander程序之前还必须做两样事情:一个是通过glAttachShader方法把程序对象与编译好的shader对象做关联;另一个是通过glBindAttribLocation方法设置属性位置,这个是方便系统在之后解析绑定数据的时候可以按照正确的约定读取属性信息。
通过glGetShaderiv,传入GL_LINK_STATUS参数可以查看链接状态。
4)运行shader
在绘制的逻辑中,使用glUseProgram方法可以把程序对象关联到opengl绘图上下文中
通过glUniformMatrix4fv可以传递参数到shader中,具体传递的是哪个参数由该方法的第一个参数决定,而第一个参数的具体值可以在链接shader之后调用glGetUniformLocation获取。
做好了上述一切,在调用opengl的绘制方法时,底层会直接使用shader进行绘制。
ps:
1.opengl对外暴漏的是类c语言的接口方式,它按照下面的思维方式处理对象。
1)用户可以通过系统函数创建一些对象,返回给用户的只是对象的一个句柄,在opengl里用GLuint类型表示。
2)在调用对象相关方法时有两种方案,一种是使用方法的参数(一般是第一个参数)指定要操作哪个对象;另一种是通过一些bind方法,把对象绑定在系统底层的环境上下文中,此后所有的函数调用就都跟之前绑定的对象相关。
参考资料:
http://www.ityran.com/article-80-1.html
http://zh.wikipedia.org/wiki/GLSL
http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html
¬
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。