【问题标题】:Rotating all OpenGL output旋转所有 OpenGL 输出
【发布时间】:2012-02-08 23:09:02
【问题描述】:

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

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

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

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

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

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

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

  • 其他?

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

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

【问题讨论】:

    标签: android opengl-es shim


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 正如我所说,我无法控制游戏 --- 我所能做的就是拦截它对 OpenGL 的调用。我无法控制游戏的渲染管道,因此我没有足够的信息来执行此操作。
    • 如果可能的话,你能设置视口吗??
    • 我可以拦截游戏对glViewport() 的调用,是的——有帮助吗?
    • 只是一个想法。拦截对 glBegin 和 glEnd 的调用。在 glBegin 之前做一个 glRotate。在 glEnd 之后再次调用 glRotate。
    • OpenGL ES 没有 glBegin 和 glEnd... 恐怕还是没有解决游戏直接访问颜色缓冲区的情况。
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2017-08-24
    相关资源
    最近更新 更多