18

似乎我能找到的所有关于 OpenGL-ES 的文档都说“OpenGL-ES 就像 OpenGL,但没有很多东西。例如,没有 glBegin 或 glEnd”。

太棒了。那么,还有什么 ELSE 没有的呢?或者有什么清单?或者也许是移植指南?

(具体来说,我正在尝试将现有的 GL 应用程序移至 iPhone,尽管我不想将 Q 限制在 iPhone 上。)

4

2 回答 2

14

回答您的问题的部分问题是缺少很多东西,而且通常是一组很少使用或不适用的位标志。描述差异的最佳文档实际上是实现标头。

对于我正在开发的框架,我决定让它在桌面和 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“针对 iPhone OS 优化 OpenGL ES”,了解其他可能对移植有用的提示。

到目前为止,移植对我来说相当轻松,除非你的应用程序做了一些非常高级的 OGL 东西或使用了完全不受支持的功能,否则你会通过点击构建按钮来发现你的问题,并且通过挖掘一点点可以很明显地找到一个简单的修复gl.h 文件。事实上,移植到 ES 会迫使您编写良好的优化渲染代码。

于 2009-01-07T19:57:37.620 回答
13

从Khronos.org 的 OpenGL ES 1.X 信息页面链接到的“OpenGL ES 1.1.12 差异规范” (PDF)介绍了OpenGL ES 1.X 和 OpenGL 1.5 之间的差异。OpenGL ES 1.1 是 iPhone 上使用的版本。

差异规范并不是我见过的最简单的文档,但它比一般的 OpenGL 规范更容易阅读。我建议获取您调用的 OpenGL 函数列表,然后在差异文档中搜索它们。它将显示它们是否在 OpenGL ES 中受支持,如果仅部分支持,您可以查看完整规范以获取更多信息。

于 2008-11-07T20:43:50.790 回答