【问题标题】:Import PNG texture to memory but not framebuffer- using C++ and OpenGL将 PNG 纹理导入内存而不是帧缓冲区 - 使用 C++ 和 OpenGL
【发布时间】:2012-03-28 18:11:30
【问题描述】:

我正在为我正在开发的一个简单游戏研究一种可能的碰撞检测方法,但我现在陷入困境。

我正在尝试将纹理加载到内存中但不加载到帧缓冲区中并使用坐标从中读取像素(特别是颜色)...我可以轻松读取缓冲区内容并获取坐标处像素的颜色但是我不知道如何在纹理上执行此操作,甚至可能吗?

任何帮助/指导/研究什么或可能的功能将不胜感激。

注意:我使用的是 OpenGL 2.0

【问题讨论】:

    标签: c++ memory opengl png textures


    【解决方案1】:

    OpenGL 不是图像处理,也不是图像访问库。这是一个绘图 API,因此应该对其进行处理。使用 OpenGL 可以读回(整个)纹理(虽然性能不是很好)。在 OpenGL-ES 上没有直接读取纹理数据的方法。

    您已经在常规缓冲区中保存了整个纹理图像?很好,因为这就是你想要操作的东西。读取单个像素的颜色只是愚蠢的,因为它会因函数调用开销而阻塞 CPU。

    【讨论】:

    • 我很欣赏你所说的,但我并不是说只在 OpenGL 中这样做,我是说我使用 OpenGL 和 C++ 将 PNG 作为纹理加载 - 我不在乎如何我阅读了纹理,无论是在 C++ 还是 OpenGL 中,我都在寻求最好的方法,但感谢您的建议,我会牢记这一点并尝试考虑其他解决方案。
    • @trystan:OpenGL 不处理从文件中加载图像,因此无论您使用哪种方法将 PNG 加载到纹理中,它还应该为您提供带有纹理数据的缓冲区也用于将数据上传到OpenGL。我建议你从那里获取数据。
    • @trystan 好吧,就像 datenwolf 所说,最好的方法是不为此使用 OpenGL。只需从您已经拥有的 CPU 内存缓冲区中获取像素值(因为您将图像从文件加载到 CPU 内存中,不是吗?)。
    • @trystan:尝试 LodePNG 加载 PNG。 LodePNG 运行良好,体积小且易于使用。 lodev.org/lodepng
    【解决方案2】:

    将 png 解码为常规缓冲区。 通过 glGenTextures 创建纹理; 通过 glBindTexture 绑定纹理; 通过 glTexImage2D 将图像加载到纹理。

    【讨论】:

    • 我明白这一点,但我该如何从纹理中读取像素? glReadPixels 仅从帧缓冲区读取像素。谢谢
    • @trystan:为什么需要从纹理中读取像素?你给了纹理它的数据;除非您稍后渲染到该纹理,否则它将具有您给它的相同像素。因此,如果您在 CPU 上需要它,只需在创建纹理后保留缓冲区即可。
    • 我有多个纹理渲染到帧缓冲区,所以从帧缓冲区读取是不好的,我需要从特定的纹理/图像中读取,因为这将用作碰撞检测的参考,如果这可以澄清任何事情?
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 2011-11-24
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多