【问题标题】:Opengl-es 1.1 change pixel data on the FBOOpengl-es 1.1 改变FBO上的像素数据
【发布时间】:2012-08-02 06:54:44
【问题描述】:

有没有办法获取 FBO 像素数据,然后:快速对其进行灰度化并再次将图像取回该 FBO?

【问题讨论】:

    标签: opengl-es fbo


    【解决方案1】:

    如果您使用的是固定功能管道 (ES 1.1),您可以使用 glReadPixels 从 GPU 中提取像素数据,以便直接处理它。然后,您需要根据该结果创建一个纹理,并渲染一个映射到新纹理的四边形。但这是实现结果的一种相当低效的方式。

    如果您使用着色器 (ES 2.0),您可以直接在 GPU 上执行此操作,这样更快。这意味着通过以下几种方式之一在片段着色器中进行灰度处理:

    1. 如果你的渲染一开始很简单,你可以在你的普通片段着色器中添加灰度数学,也许可以用一个布尔统一变量来切换它。

    2. 如果您不想在正常管道中弄乱灰度,您可以正常渲染到屏幕外 FBO(纹理),然后使用特殊的灰度纹理着色器将该纹理的内容渲染到屏幕的 FBO采样纹素的数学运算。

    如果需要,这里是灰度数学:https://web.archive.org/web/20141230145627/http://bobpowell.net/grayscale.aspx 本质上,将 RGB 值代入该公式,并在所有通道中使用生成的亮度值。

    【讨论】:

    • 谢谢,但 glReadPixels 不是一个选项,因为它非常缓慢且滞后。 :( 固定管道中还有其他的吗?
    • @lacas:没有着色器,唯一的另一种方法是在开始时实际以灰度渲染屏幕。您可能需要问一个单独的问题,其中包含有关您的场景的更多详细信息(2d?3d?照明?等)以获得有关如何解决这个问题的精明答案,但理论上您可以调整所有颜色,以便您只用灰色着色。
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多