gpt4 book ai didi

iOS GLSL。有没有办法使用 GLSL 着色器创建图像直方图?

转载 作者:技术小花猫 更新时间:2023-10-29 10:19:46 34 4
gpt4 key购买 nike

在 StackOverflow 的其他地方提出了一个关于深度缓冲区直方图的问题 - Create depth buffer histogram texture with GLSL .

我正在编写一个 iOS 图像处理应用程序,对这个问题很感兴趣,但对所提供的答案不清楚。那么,是否可以通过 GLSL 使用 GPU 创建图像直方图?

最佳答案

是的,虽然它在 iOS 上比您想象的要难一些。这是一个完全在 GPU 上生成和绘制的红色直方图,针对实时视频源运行:

GPU red histogram

Tommy's suggestion在问题中,您链接是一个很好的起点,this paper by Scheuermann and Hensley 也是如此。 .建议使用散射为图像中的颜色 channel 建立直方图。散射是一个过程,您将点网格传递给顶点着色器,然后让该着色器读取该点的颜色。然后将所需颜色 channel 在该点的值写为 X 坐标(Y 和 Z 坐标为 0)。然后,您的片段着色器会在目标坐标处绘制一个半透明的 1 像素宽的点。

该目标是一个 1 像素高、256 像素宽的图像,每个宽度位置代表一个色 block 。通过写出具有低 alpha channel (或低 RGB 值)的点,然后使用加法混合,您可以根据特定颜色值在图像中出现的次数为每个 bin 累积更高的值。然后可以读取这些直方图像素以供以后处理。

在 iOS 的着色器中这样做的主要问题是,尽管 reports to the contrary , Apple 明确指出顶点着色器中的纹理读取在 iOS 上不起作用。我在我所有的 iOS 5.0 设备上都试过了,但没有一个能够在顶点着色器中执行纹理读取(屏幕变黑,没有抛出任何 GL 错误)。

为了解决这个问题,我发现我可以读取输入图像的原始像素(通过 glReadPixels()faster texture caches )并使用 GL_UNSIGNED_BYTE 将这些字节作为顶点数据传递类型。以下代码实现了这一点:

glReadPixels(0, 0, inputTextureSize.width, inputTextureSize.height, GL_RGBA, GL_UNSIGNED_BYTE, vertexSamplingCoordinates);

[self setFilterFBO];

[filterProgram use];

glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);

glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);
glEnable(GL_BLEND);

glVertexAttribPointer(filterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates);
glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor);

glDisable(GL_BLEND);

在上面的代码中,您会注意到我使用了一个步幅来仅对一小部分图像像素进行采样。这是因为您可以写出的最低不透明度或灰度级别是 1/256,这意味着一旦该图像中超过 255 个像素具有该颜色值,每个 bin 就会达到最大值。因此,我不得不减少处理的像素数量,以便将直方图的范围控制在这个有限的窗口内。我正在寻找一种方法来扩展这个动态范围。

用于执行此操作的着色器如下,从顶点着色器开始:

 attribute vec4 position;

void main()
{
gl_Position = vec4(-1.0 + (position.x * 0.0078125), 0.0, 0.0, 1.0);
gl_PointSize = 1.0;
}

并以片段着色器结束:

 uniform highp float scalingFactor;

void main()
{
gl_FragColor = vec4(scalingFactor);
}

可以在我的开源 GPUImage 中找到一个有效的实现框架。获取并运行 FilterShowcase 示例以查看直方图分析和自己绘制。

此实现存在一些性能问题,但这是我能想到的在 iOS 上的 GPU 上执行此操作的唯一方法。我愿意接受其他建议。

关于iOS GLSL。有没有办法使用 GLSL 着色器创建图像直方图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10316708/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com