【问题标题】:What's "in" and "out" of OpenGL-ES? (Porting from OpenGL)OpenGL-ES 的“输入”和“输出”是什么? (从 OpenGL 移植)
【发布时间】:2010-09-21 08:09:15
【问题描述】:

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

好的,那太好了。那么,还有什么 ELSE 没有的呢?或者是否有 in 的列表?或者也许是移植指南?

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

【问题讨论】:

    标签: iphone opengl opengl-es porting


    【解决方案1】:

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

    对于我正在开发的框架,我决定让它在桌面和 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 有点强迫你编写好的优化渲染代码。

    【讨论】:

    • 有趣:我似乎在任何地方都找不到该技术说明。有什么想法吗?
    • 这里是直接链接,尽管您显然需要 iPhone 开发人员访问权限(免费)。 developer.apple.com/iphone/library/technotes/tn2008/tn2230.html
    • 不——从外观上看,Apple (通常)只是简单地删除了该页面。 :(
    【解决方案2】:

    链接到the OpenGL ES 1.X info page at Khronos.org"OpenGL ES 1.1.12 Difference Specification" (PDF) 介绍了 OpenGL ES 1.X 和 OpenGL 1.5 之间的差异。 OpenGL ES 1.1 是 iPhone 上使用的版本。

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

    【讨论】:

    • 好的,这行得通。抱歉,ES 新手,直到发布问题后才找到 Khronos 网站(哦!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2010-11-13
    相关资源
    最近更新 更多