0

外部需求——你必须讨厌它们……

我有一个 OpenGL ES 游戏,它使用 EGL 和 OpenGL ES 在屏幕上绘图。我没有这方面的资料;它作为二进制 blob 提供。我正在实现在游戏对 EGL 和 OpenGL 的调用与平台的实现之间进行调解的接口层。

它工作正常。但是我现在有一个意想不到的外部要求,我需要能够将整个游戏的输出旋转 90 度。

谁能建议任何好的(简单,快速)方法来做到这一点?在我的脑海中,我能想到:

  • 将适当的变换插入游戏的投影矩阵。在我看来,这似乎是最快的解决方案;但我认为我对游戏对投影矩阵的操作没有足够的知识来可靠地做到这一点。另外,如果它使用任何 OpenGL 调用来访问不通过投影矩阵的屏幕,它会混淆游戏。(glReadPixels()例如。)

  • 为游戏提供屏幕外缓冲区的渲染上下文;它在那里渲染,然后当游戏调用时,eglSwapBuffers()我将结果复制到屏幕上。渲染到纹理在这里会有所帮助。问题:这会影响性能,因为我实际上是在进行两次绘图而不是一次;并且渲染到纹理在 OpenGL ES 中没有标准化。(我的目标平台 Android 甚至不可靠地支持共享上下文。)

  • 渲染到颜色缓冲区,然后使用glReadPixels()将数据复制出来并在屏幕上进行软件旋转。问题:非常慢,而且我无法控制缓冲区的大小(即如果屏幕是 640x480 并且我们正在绘制 90° 旋转,我真的想给游戏一个 480x640 的颜色缓冲区)。

  • 其他?

特定于游戏的黑客在这里不是一个选项,因为我需要能够将游戏二进制文件换成另一个;这必须是一个通用的修复。更改游戏不是一种选择,因为我们无法控制游戏源代码。

有什么建议么?除了试图说服要求离开的非技术性问题之外?

4

1 回答 1

0

您必须沿 z 轴使用 glRotate 有什么问题?方法1是要走的路。

像素操作很繁重,您可能会弄乱纵横比等。

进入绘图的步骤是
1. 设置转换矩阵(模型/投影)
如果是横向,则应用 glRotate 2. 如果是横向,则设置视口(每次旋转屏幕时可能会改变)
- 将 ab 设置为高度/如果横向分别设置宽度 - 分别将 ba 设置为高度/宽度 3. 绘制矩阵

当您旋转屏幕时,对象会再次被渲染。所以 glRotate 是最好的方法。

于 2012-02-08T15:09:02.447 回答