C 在没有GLSL支持的情况下在屏幕/纹理中查找最大最小像素亮度

C 在没有GLSL支持的情况下在屏幕/纹理中查找最大最小像素亮度,c,opengl,opengl-es,shader,opengl-sc,C,Opengl,Opengl Es,Shader,Opengl Sc,在我的2D地图应用程序中,我有16位heightmap纹理,其中包含与地图上某个点相关联的高度(以米为单位) 当我在屏幕上绘制这些纹理时,我想显示一个分析,这样屏幕上最高高度的像素是白色的,屏幕上最低高度的像素是黑色的,中间的值在这两者之间插值 我使用的是较旧的OpenGL版本,因此无法访问像GLSL或PBO这样的现代管道功能(正如我所听说的那样,这可以使将颜色缓冲区内容获取到CPU端的效率比glReadPixels高得多) 我可以访问ATI_fragment_着色器扩展,它可以使用基本片段着色

在我的2D地图应用程序中,我有16位heightmap纹理,其中包含与地图上某个点相关联的高度(以米为单位)

当我在屏幕上绘制这些纹理时,我想显示一个分析,这样屏幕上最高高度的像素是白色的,屏幕上最低高度的像素是黑色的,中间的值在这两者之间插值

我使用的是较旧的OpenGL版本,因此无法访问像GLSL或PBO这样的现代管道功能(正如我所听说的那样,这可以使将颜色缓冲区内容获取到CPU端的效率比glReadPixels高得多)

我可以访问ATI_fragment_着色器扩展,它可以使用基本片段着色器合并这些纹理中的R和G通道,并获得单个浮动灰度亮度值

然后,我就能够在着色器中根据最大和最小像素亮度值重新着色这些像素(将它们映射到0-1范围),但我不知道它们是什么

我的问题是,在当前屏幕上的像素之间,我如何找到具有最大和最小亮度值的像素?或者,作为替代,如何在纹理中找到这些值?(因为我可以在屏幕上绘制带有灰度亮度值的纹理后调用glCopyTexImage2D,并将数据作为纹理检索)

到目前为止我试过或读过的东西:

-如果我能以某种方式将颜色缓冲区中的当前像素RGB值传送到CPU端,我就可以手动找到我需要的,然后使用它们。但是,使用glReadPixels读取颜色缓冲区内容的速度慢得令人无法接受。即使我将其设置为在多个帧上完成一个读取操作,也没有用


-将纹理下采样到1x1大小,直到最后一个站立像素为最小值或最大值,然后在着色器内部使用此1x1纹理。如果没有GLSL和texel抓取支持,我不知道如何实现这一点,因为我必须查找当前像素的右侧、上方和上方的像素,并找到它们之间的最小/最大值。

@rabbi76“Shader”我在这里提到的是ATI_fragment_着色器扩展提供的基本片段着色器。它不是用GLSL编写的。所以实际上您正在使用OpenGL 1.0+ATI_fragment_着色器?实际上它是OpenGL SC 1.0.1+一些扩展…我为您感到非常抱歉。感谢您的哀悼:)@rabbi76“着色器”我在这里提到的是ATI_fragment_着色器扩展提供的基本片段着色器。它不是用GLSL编写的。所以实际上您使用的是OpenGL 1.0+ATI_fragment_着色器?实际上是OpenGL SC 1.0.1+一些扩展…我为您感到非常抱歉。感谢您的哀悼:)