Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es Opengl es 1.1更改FBO上的像素数据_Opengl Es_Fbo - Fatal编程技术网

Opengl es Opengl es 1.1更改FBO上的像素数据

Opengl es Opengl es 1.1更改FBO上的像素数据,opengl-es,fbo,Opengl Es,Fbo,有没有一种方法可以获取FBO像素数据,然后:快速进行灰度缩放并将图像恢复到该FBO?如果使用固定功能管道(ES 1.1),可以使用glReadPixels从GPU中提取像素数据,以便直接处理它。然后需要根据该结果创建纹理,并渲染映射到新纹理的四边形。但这是一种相当低效的实现结果的方式 如果您使用着色器(ES 2.0),则可以直接在GPU上执行此操作,速度更快。这意味着可以通过以下几种方式之一在片段着色器中执行灰度缩放: 如果渲染一开始很简单,则可以在法线片段着色器中添加灰度数学,并可能使用布尔统

有没有一种方法可以获取FBO像素数据,然后:快速进行灰度缩放并将图像恢复到该FBO?

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

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

  • 如果渲染一开始很简单,则可以在法线片段着色器中添加灰度数学,并可能使用布尔统一变量进行切换

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


  • 如果需要,这里是灰度数学:基本上,将RGB值插入该公式,并在所有通道中使用得到的亮度值。

    谢谢,但glReadPixels不是一个选项,因为它非常缓慢和滞后(还有其他固定管道吗?@lacas:如果没有着色器,唯一的其他方法是从灰度开始实际渲染屏幕。您可能需要问一个单独的问题,并提供有关场景的更多细节(2d?3d?照明?等)为了得到关于如何实现这一点的精明答案,但理论上你可以调整你所有的颜色,这样你只能用灰色来着色。