Opengl es OpenGL ES 2.0顶点着色器纹理无法从FBO读取?

Opengl es OpenGL ES 2.0顶点着色器纹理无法从FBO读取?,opengl-es,textures,shader,gpgpu,Opengl Es,Textures,Shader,Gpgpu,我目前正在从事一个使用OpenGLES2.0的GPGPU项目。我有一个渲染管道,它使用帧缓冲区对象(FBO)作为目标,即每个渲染过程的结果都保存在附加到FBO的纹理中。到目前为止,这在使用片段着色器时有效。例如,我必须执行以下渲染管道: Preprocessing (downscaling, grayscale conversion) -> Adaptive Thresholding Pass 1 -> Adapt. Thresh. Pass 2 -> Copy back t

我目前正在从事一个使用OpenGLES2.0的GPGPU项目。我有一个渲染管道,它使用帧缓冲区对象(FBO)作为目标,即每个渲染过程的结果都保存在附加到FBO的纹理中。到目前为止,这在使用片段着色器时有效。例如,我必须执行以下渲染管道:

Preprocessing (downscaling, grayscale conversion)
-> Adaptive Thresholding Pass 1  -> Adapt. Thresh. Pass 2
-> Copy back to CPU
但是,我想通过在预处理步骤之后添加灰度直方图计算来扩展这个管道。据我所知,在OpenGL ES 2.0中,这仅适用于顶点着色器中的纹理读取[1]。我可以确认着色器在不同的程序中工作,其中输入是“真实”图像,而不是附加到FBO的渲染纹理。因此,我认为如果纹理数据来自FBO,则不可能在顶点着色器中读取纹理数据。有人能证实这个假设吗?或者我遗漏了什么?我在用Nexus10做实验


[1] :它基本上是通过从顶点着色器中的纹理中读取每个像素值来工作的,然后从中计算直方图单元并使用alpha混合将其“添加”到片段着色器中。

顶点着色器中的纹理读取在OpenGL ES 2.0中不是必需的元素,因此,你会发现一些制造商支持它们,而有些则不支持。事实上,iOS在某些设备上支持一个版本的iOS,但在下一个版本中不支持(现在iOS 7正式支持)。这可能是你在这里看到的不一致性的根源


要解决此问题,请将FBO(或其附加纹理)的颜色作为顶点输入,并使用类似于您描述的散射操作。这不需要在顶点着色器中读取任何类型的纹理,但它确实涉及到从GPU到GPU的往返过程,并且可能涉及很多顶点。它适用于所有OpenGL ES 2.0硬件,但成本可能很高。

当您尝试读取附加纹理时,FBO是否绑定?确实是。这不是问题所在(见下文)。我了解你在GPUImage项目中的出色工作,因此我了解你的方法,但问题是我喜欢有一个连续的渲染管道,这意味着我尽量避免在GPU之间来回复制数据。我不想将GPU预处理的图像复制回主内存,然后将颜色作为顶点反馈回GPU。与传统方法相比,计算直方图的速度更快。然而,似乎OpenGL ES 2.0让我无法理解:(也许有一天情况会发生变化,我们在移动设备(如OpenCL)上获得了一些对GPGPU的适当支持。您是否为iOS 7及更高版本实现了直方图,在顶点着色器中完成了所有计算?我没有看到。