iOS开发与OpenGL ES相关问题整理(1)

转载自:http://www.bennychen.cn/2011/05/ios开发与opengl-es相关问题整理(1)/

在极其有限的工作日的晚上和周末进行着iOS上game programming的研究,进展非常缓慢,不过还是有必要将过程中的一些问题随时记录下来。

OpenGL ES崩溃在函数’glMatrixMode’

这很有可能是因为在OpenGL ES2的context中使用OpenGL ES1的函数,ES1是固定函数渲染管线 (fixed function pipeline),而ES2是可编程的渲染管线 (programmable pipeline),ES2不再支持这些ES1的固定渲染管线的函数, 比如’glMatrixMode’。所以当ES2遇到这些不支持的ES1函数时,你的程序会收到一个’EXC_BAD_ACCESS’消息并且崩溃。通过gdb查看callstack,显示最后一个函数是gliUnimplemented:

1 #0 0x0b05c0e5 in gliUnimplemented ()
2 #1 0x00a1c6c3 in glMatrixMode ()

如果一定要使用ES1函数, 你只能以ES1来初始化你的GL context:

1 EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

函数’pathForResource’返回nil

需要将资源文件添加到项目的’Groups & Files’中

OpenGL ES崩溃在绘制函数’glDrawArrays’

这可能是因为你启动了GL的某个渲染状态(比如vertex,color,texture coordinate等等,这里有所有可能状态的清单),但是却没有在绘制函数(比如’glDrawArray’)进行之前,设置该状态所对应的数据指针。

比如说:

1 glEnableClientState( GL_COLOR_ARRAY );
2 glColorPointer( 4, GL_UNSIGNED_BYTE, 0, youColorArray );

对于上面这两句代码,如果你设置了使用color数组,但是却没有设置color数组指针,在真正的绘制时你的程序就会因为找不到对应的指针而崩溃。同样的, 如果你调用了‘glEnableClientState(GL_TEXTURE_COORD_ARRAY), 则你也需要通过glTexCoordPointer()设置纹理坐标的数组指针,如此类推。

怎么样通过OpenGL ES以像素为单位来绘制,而不是屏幕比例?

在iPhone上通过OpenGL ES进行2D绘制时,默认的原点位置在屏幕中央,并且屏幕的坐标范围依次是从-1到1,不管是横轴还是纵轴。如下图所示,GL中的默认的单位1分别代表着屏幕长度和宽度的一半。

图片来自book: ‘Learning iOS Game Programming_A Hands-On Guide to Building Your First iPhone Game
如果希望将原点移动到屏幕左下角,并且绘制时希望以像素为单位,只需要通过glOrthof函数将投影矩阵设置成一个垂直投影矩阵即可,代码如下:

1 glMatrixMode(GL_PROJECTION);
2 glLoadIdentity();
3 glOrthof( 0, framebufferWidth, 0, framebufferHeight, -1, 1 );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值