将这些OpenGL函数替换为OpenGL ES?

3
我希望能够将我的PC OpenGL应用程序和iPhone应用程序迁移至一个XCode项目中(为了方便)。因此,如果我对这些源文件进行更改,我希望这些更改同时适用于两个平台,并且希望能够从一个项目中为两个平台编译。我该如何实现这一点? 在XCode 4或3.25中有没有这样做的方法?任何帮助都将不胜感激
编辑:好的,我已经走得很远——总的来说,XCode 4似乎可以解决这个问题。 我唯一的问题是这些OpenGL / Glut函数,在iPhone上无法使用。
glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT );
glPopAttrib();
glutGet(GLUT_ELAPSED_TIME);
glutSwapBuffers();

有什么办法可以解决这些问题吗?


尽管与OpenGL应用程序无关,但这个问题询问了类似的东西:iPhone /桌面应用程序使用相同的代码库 - Brad Larson
1
你最好使用GL ES编写引擎,然后为PC开发出OpenGL的等效版本... - Goz
在不违反保密协议的情况下,Xcode 4中的新功能是否需要创建一个针对两个平台的项目? - Brad Larson
4个回答

3

PushAttrib/PopAttrib需要被手动跟踪状态的代码替换掉,或者你可以重写代码来设置依赖这些状态的内容。

glutGet(GLUT_ELAPSED_TIME)可以被mach_absolute_time替换(不是非常简单,但这是正确的用法),或者使用[NSDate timeIntervalSinceReferenceDate](相对简单,但存在潜在问题,因为它不能保证单调递增,或每秒以1.0的速度增加)。

glutSwapBuffers将被你的EAGLContext中的-presentRenderbuffer:所替代(但看起来你已经在做这个了;如果没有,你就看不到任何东西了)。


2
你可以使用 dgles 来包装你的桌面 OpenGL 实现,并提供 OpenGL ES 1.x 接口。

2

我在网上找到了有关OpenGL ES 1.0规范的文档

应用程序需要查询内部状态的某个类型或另一个类型有几个原因。 应用程序可能需要动态发现实现限制(像素组件大小,纹理尺寸等),或者应用程序可能是分层库的一部分,它可能需要保存和恢复任何作为其渲染的一部分而干扰的状态。 PushAttrib和PopAttrib可用于执行此操作,但它们实现和使用成本高昂,因此不受支持。通常,不建议使用状态查询,因为它们通常对性能有害。与其尝试划分可以查询的不同类型的动态状态(例如矩阵堆栈的顶部),不支持任何动态状态查询,应用程序必须影子状态更改而不是查询管道。这使得分层库变得困难,但没有足够的理由保留动态状态查询或属性推送和弹出。

那么这个其他链接似乎表明您需要自己跟踪那些位。没有帮助。

glut只调用系统代码,对吗?(wglSwapBuffers,glxSwapBuffers)

试试这个这里eglSwapBuffers和可能这本书

抱歉我没有更具体的答案。


1

对于这种看似简单的推送属性功能缺失非常恼人,但是您可以使用glGet来获取设置参数之前的某些状态,例如以下代码对我有效:

Boolean tmpB;
int tmpSrc,tmpDst;

glGetBooleanv(GL_BLEND,&tmpB);
glGetIntegerv(GL_BLEND_SRC_ALPHA,&tmpSrc);
glGetIntegerv(GL_BLEND_DST_ALPHA,&tmpDst);    


glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//draw rectangle
CGSize winSize=[[CCDirector sharedDirector] winSize];
CGPoint vertices[] = { ccp(0,0), ccp(winSize.width,0), ccp(winSize.width,20), ccp(0,20) };
glColor4ub(255, 0, 255, 55);
ccFillPoly( vertices, 4, YES);


if(!tmpB)
    glDisable(GL_BLEND);

glBlendFunc(tmpSrc, tmpDst);

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