繁体   English   中英

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

[英]OpenGL ES 2.0 Vertex Shader Texture Reads not possible from FBO?

我目前正在使用OpenGL ES 2.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,则无法在顶点着色器中读取纹理数据。 任何人都可以确认这个假设,还是我错过了什么? 我在实验中使用的是Nexus 10。

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

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

为解决此问题, 我实现了直方图计算 ,而不是将FBO(或其附着的纹理)的颜色作为顶点,并使用类似于您所描述的散射操作。 这不需要在顶点着色器中读取任何种类的纹理,但确实需要往返于GPU以及可能有很多顶点的往返行程。 它可以在所有OpenGL ES 2.0硬件上运行,但价格昂贵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM