回答您的问题的部分问题是缺少很多东西,而且通常是一组很少使用或不适用的位标志。描述差异的最佳文档实际上是实现标头。
对于我正在开发的框架,我决定让它在桌面和 iPhone 之间完全跨平台。我解决这个问题的方法是在 OpenGL 中编写代码,看看它在哪里中断。然后进去看看
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/
System/Library/Frameworks/OpenGLES.framework/Headers/ES1/gl.h
和比较
/Developer/SDKs/MacOSX10.5.sdk/
System/Library/Frameworks/OpenGL.framework/Versions/A/Headers/gl.h
这些标题非常简单易懂。
到目前为止,我发现的主要区别是没有 GLdouble(使用 GLdouble 的任何东西,例如 glOrtho 和 glFrustum 都有 GLfloat 版本的 glOrthof 和 glFrustumf)。由于某种原因,也没有 gluPerspective 或 gluPerspectivef。
这里有一个替换:
void gluPerspective( GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar )
{
GLfloat xmin, xmax, ymin, ymax;
ymax = zNear * tan(fovy * M_PI / 360.0);
ymin = -ymax;
xmin = ymin * aspect;
xmax = ymax * aspect;
glFrustumf( xmin, xmax, ymin, ymax, zNear, zFar );
}
由于您没有 glBegin 和 glEnd,您必须通过 glDrawArray 或 glDrawElements(首选)来完成所有操作。一个快速而肮脏的例子:
void draw( short x, short y, short w, short h )
{
const GLshort t[8] = { 0, 0, 1, 0, 1, 1, 0, 1 };
const GLshort v[8] = { x, y, x+w, y, x+w, y+h, x, y+h };
glVertexPointer( 2, GL_SHORT, 0, v );
glEnableClientState( GL_VERTEX_ARRAY );
glTexCoordPointer( 2, GL_SHORT, 0, t );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
}
查看 Apple 的技术说明 TN2230 "Optimizing OpenGL ES for iPhone OS",了解可能对移植有用的其他提示。
到目前为止,移植对我来说相当轻松,除非你的应用程序做了一些非常高级的 OGL 东西或使用完全不受支持的功能,否则你会通过点击构建按钮来发现你的问题,并且通过挖掘一个简单的修复程序将会很明显gl.h 文件中很少。事实上,移植到 ES 有点强迫你编写好的优化渲染代码。