【问题标题】:OpenGL C#, loading textures in upside downOpenGL C#,颠倒加载纹理
【发布时间】:2012-01-30 21:43:20
【问题描述】:

有没有办法在 y 坐标翻转的情况下将图像加载到 openGL 中? (上下翻转)。我正在使用 .NET Bitmap 和 BitmapData 类,并将 BitmapData.Scan0 传递给 OpenGL。

在 CPU 上使用.RotateFlip() 翻转位图太慢了。

除了翻转所有的texcoords,我可以在我们的引擎中解决这个问题吗?

【问题讨论】:

  • 您确定翻转纹理是您程序中的瓶颈吗?
  • 是的,像 FPS 计数器之类的东西在 CPU 上绘制文本并设置为纹理以在 GPU 上渲染到屏幕上。每一帧都要翻转它需要时间。

标签: c# opengl graphics textures opentk


【解决方案1】:

如果您使用片段着色器进行渲染,您可以随意解释 u、v 坐标。将它们颠倒过来应该是微不足道的,而且(几乎)是免费的。

除此之外,只需翻转您的纹理坐标。做到这一点应该不难。

【讨论】:

  • 我们正在编写一个引擎。翻转 texcoords 是我们目前正在做的事情。但它会导致其他问题,例如使用帧缓冲区渲染的纹理颠倒了。引擎的用户还应该期望模型中提供的 texcoords 与他们在着色器中使用的相同。不幸的是,这不是一个选择......
  • @Hannesh:固定函数管道提供 GL_TEXTURE 矩阵,所以你可以glMatrixMode(GL_TEXTURE); glScalef(1, -1, 1); 或者,像建议的那样在着色器中进行。
  • 如前所述,我们正在编写引擎,因此无法控制用户编写的着色器。
【解决方案2】:

您应该能够只更改纹理坐标以实现所需的翻转。

【讨论】:

    【解决方案3】:

    我认为答案是否定的。 OpenGL 将指向图像的指针作为纹理数据,我从未见过任何方法告诉他翻转线条。

    【讨论】:

      【解决方案4】:

      (编辑:忽略,问题是纹理而不是 DrawPixels)

      这在 C++ 中对我有用。

      问:“如何让 glDrawPixels() 绘制一个倒置的图像?”

      A:“试试 glPixelZoom(1.0, -1.0)。类似地,可以使用 glPixelZoom() 从左到右翻转图像。请注意,您可能需要调整光栅位置才能正确定位图像。”

      源代码:http://www.mesa3d.org/brianp/sig97/gotchas.htm

      【讨论】:

        猜你喜欢
        • 2013-05-06
        • 2023-04-02
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多