1

我目前正在桑德兰大学学习游戏机编程模块。他们在这个模块中教的是 OpenGL 和 Phyre Engine 来开发 PS3 游戏。

PS3 SDK 套件不是免费提供的(价格相当昂贵)这一事实让我在出现问题时很难解决。

显然,PS3 框架不支持大多数 gl 函数调用,如 glGenList、glBegin、glEnd 等。

glBegin(GL_QUADS);
    glTexCoord2f(TEXTURE_SIZE, m_fTextureOffset);
    glVertex3f(-100, 0, -100);

    //some more
glEnd();

在 glBegin、glEnd 和 glTexCoord2f 使用 PS3 调试模式进行调试时出现错误。

有没有办法绕过它?也许是一种不同的绘制对象的方式?

4

3 回答 3

4

大多数为 PS3 开发的游戏根本不使用 OpenGL,而是“在金属上”编程,即直接使用 GPU,无需中间的抽象 API。是的,PS3 有一个类似 OpenGL 的 API,但这实际上是基于 OpenGL-ES。

在 OpenGL-ES 中没有立即模式。即时模式是一种将几何体传递给 OpenGL 的繁琐方法,方法是启动一个图元,glBegin然后链接调用顶点属性状态设置,最后通过提交顶点的位置glVertex并以 结束glEnd没有人愿意使用它!尤其是在资源有限的系统上。

无论如何,您在内存中都有可用的几何数据。那么为什么不简单地让 OpenGL 使用已经存在的东西呢?好吧,这正是要做的事情:Vertex Arrays。你给 OpenGL 指针指向哪里可以找到数据(glVertexAttribPointer在现代 OpenGL 中是通用的,或者在旧的固定函数中预定义的、固定的属性glVertexPointerglTexCoordPointerglNormalPointer、 ),然后让它使用orglColorPointer绘制一大堆数据。glDrawElementsglDrawArrays

在现代 OpenGL 中,绘图过程由用户可编程着色器控制。在固定函数OpenGL 中,您所能做的就是参数化膨胀数量的状态变量。

于 2013-04-20T01:04:52.113 回答
2

PlayStation 3 使用的 OpenGL 是 OpenGL ES 1.0 的一个变体(根据维基百科的 ES 2.0 的一些特性)。

http://www.khronos.org/opengles/1_X

有规范。那里似乎没有 glBegin/glEnd 函数。那些(如固定的管道函数)已被弃用(并且在 OpenGL 4.0 和 OpenGL ES 2.0 中被删除),无论如何都支持 VBO 之类的东西,所以学习如何使用这些可能没有多大意义。

于 2013-04-19T23:13:30.040 回答
0

如果您使用 PhyreEngine,通常应避免直接调用图形 API,因为 PhyreEngine 位于不同平台上的不同 API 之上。

在 PC 上它使用 GL(或 D3D),但在 PS3 上它使用较低级别的 API。因此,即使您使用了 GL-ES 功能,并且即使它可以编译,它也可能无法运行。因此,在为 PS3 构建时看到错误也就不足为奇了。

理想情况下,您应该使用 PhyreEngine 的绘图管道,它与平台无关。如果您坚持使用该 API,原则上您可以为任何受支持的平台编译代码。

我可以公开评论 PhyreEngine 的数量是有限制的(抱歉),但如果你在上大学课程,你的大学应该可以访问官方支持论坛,在那里你可以获得更具体的帮助。

如果您确实必须直接针对底层图形 API,请注意您可能需要针对每个平台编写/修改代码,并且您需要在 PhyreEngine 可能依赖的任何上下文状态下“玩得很好”。

于 2013-04-20T11:51:56.993 回答