OpenGL-ES中的“in”和“out”是什么?(从OpenGL移植)

18

看起来我能找到的OpenGL-ES文档都会说些类似于“OpenGL-ES和OpenGL很相似,但是去掉了很多东西。例如,没有glBegin或glEnd。”

好的,那么还有什么其他的东西没有吗?或者有什么功能列表?或者可能有一个移植指南?

(具体来说,我正在尝试将一个现有的GL应用程序移植到iPhone上,尽管我不想将我的问题限制在iPhone上。)

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 );
}

请查看苹果的技术笔记TN2230“为iPhone OS优化OpenGL ES”,获取其他有用迁移提示。
就我个人而言,到目前为止,迁移工作相当轻松,除非你的应用程序使用了一些高级的OGL功能或完全不支持的功能,否则只需点击构建按钮即可找到问题,并通过在gl.h文件中简单查找解决。事实上,迁移到ES会迫使您编写良好优化的渲染代码。

有趣的是:我似乎找不到那个技术说明。你有什么想法吗? - cbrulak
这是直接链接,但显然您需要iPhone开发者访问权限(免费)。 http://developer.apple.com/iphone/library/technotes/tn2008/tn2230.html - Patrick Hogan
不好意思 - 看起来苹果公司(典型地)只是删除了该页面。 :( - Adam

13

Khronos.org网站上的《OpenGL ES 1.X信息页面》链接到的“OpenGL ES 1.1.12差异规范”(PDF)详细介绍了OpenGL ES 1.X和OpenGL 1.5之间的区别。其中,iPhone使用的是OpenGL ES 1.1版本。

该差异规范文档并不是我见过的最简单的文件,但比OpenGL规范总体来说要容易阅读得多。我建议列出你所调用的OpenGL函数列表,并在差异文档中进行搜索。这将向您展示它们是否支持OpenGL ES,如果仅支持部分功能,则可以去查看完整规范文档以获取更多信息。


好的,那个可行。抱歉,我对ES还不熟悉,在发布问题后才发现了Khronos网站(唉!)。 - Olie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接