首页 > 解决方案 > 在不支持 GLSL 的情况下在屏幕/纹理中查找最大最小像素亮度

问题描述

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

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

我使用的是较旧的 OpenGL 版本,因此无法访问 GLSL 或 PBO 等现代管道功能(据我所知,这可以使将颜色缓冲区内容发送到 CPU 端比 glReadPixels 更有效)。

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

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

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

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

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

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

标签: copenglopengl-esshaderopengl-sc

解决方案


推荐阅读