游戏开发客户端图形核心技术就是openGL,在手机上的版本叫openGLES,这是一个它的轻量级版本。目前主流的游戏引擎cocos,unity都是在它的基础上进行了封装,并为开发者提供使用更简单的API或者可视化编辑器,因此,大多数情况下,我们并不需要透彻的去了解OpenGL是如何工作的。但了解是必要的,比如笔者就遇到了一个这样的问题。
问题描述:在维护一个 基于 cocos 2.1.3 (一个比较古老的版本)的旧项目的时候,运行这个项目的mac版本会出现如下的错误:
cocos2d: cocos2d: ERROR: Failed to compile vertex shader
问题的大概意思是:无法编译顶点着色器,而且通过openGL自带的日志函数也无法获得任何错误信息。从而导致程序无法运行。找了数天,都没有找到原因。这时候内心是
于是问题被搁置,直到过完春节,再来研究这个问题的时候,有了新的发现。编译shader之前需要调用
glCreateProgram();然而它的返回值始终为0。百度,google各种搜索,依然没有找到现成的解决方案,不过也得到了一些有用的信息,那就是 openGL的context没有初始化好。朝着这个方向,继续上前查询代码,终于在 EALView.mm文件中,发现了一个 prepareOpenGL 的函数,是用来初始化openGL的。然而在调试的时候,并没有发现这个函数被调用过。于是尝试修改 initWithFrame 如下:
if( context ){
[selfsetOpenGLContext:context];
}
else{
[self prepareOpenGL];
}
else是 新增的代码,重新编译运行程序。终于成功!
结论:
-
选择一个好引擎。
-
也要适当了解OpenGL。