【问题标题】:fixing glCopyTexSubImage2D upside down textures修复 glCopyTexSubImage2D 倒置纹理
【发布时间】:2010-10-22 01:19:36
【问题描述】:

自从我开始学习渲染到纹理后,我逐渐明白glCopyTexSubImage2D() 会将屏幕的指定部分倒置。为了防止/解决此问题,我尝试了一些想到的简单方法,但找不到优雅的解决方案。

  • 在将纹理渲染到屏幕之前执行 ::glScalef(1.0f, -1.0f, 1.0f) 有两个问题: 1,我每次使用纹理时都必须这样做。 2,我主要使用 2D 图形,并为 GL_BACKsides 关闭了背面剔除。我希望尽可能节省打开和关闭它的时间。

  • 尝试将矩阵模式切换到 GL_TEXTURE 并在捕获时进行 ::glScalef(1.0f, -1.0f, 1.0f) 转换,但结果相同。 (我猜纹理矩阵只对 glTexCoord 调用有影响?)

那么,如何修复glCopyTexSubImage2D 捕获的纹理的上下方向?

【问题讨论】:

    标签: c++ opengl capture render textures


    【解决方案1】:

    你打算用纹理图像做什么?实际上,尝试将它们倒置通常比将代码移到其他地方需要更多的工作。

    如果您想在不导出图像的情况下使用图像,那么只要在使用结果的任何位置翻转纹理坐标将是最有效的方法。

    如果您尝试导出它,那么您要么想在渲染后自己翻转它们。

    在相关说明中,如果您正在制作 2D 游戏,为什么要打开背面剔除?

    【讨论】:

    • 好点。恐怕这是一个猜测优化的例子。=)另外,我不需要为这个游戏翻转纹理 - 无论如何,直到现在。我还有待观察它会慢多少,但与此同时,关闭背面剔除和翻转似乎是最简单和最优雅的解决方案。谢谢!
    【解决方案2】:

    如果我的理解是正确的,那取决于你的出身。该函数似乎假设您的原点位于左下角,而大多数 2D 内容假设原点位于左上角,这就是为什么它看起来是颠倒的。

    我想您可以将原点更改为左下角,进行捕获,然后将原点更改回左上角并在进行交换之前再次渲染。但这是一个糟糕的解决方案,因为您实际上要渲染两次,但如果您不打算每帧都这样做,那可能没问题。

    【讨论】:

      【解决方案3】:

      使用 glReadPixels() 复制到缓冲区,翻转图像,然后使用 glTexImage2D() 将其写回。

      【讨论】:

        猜你喜欢
        • 2013-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        相关资源
        最近更新 更多