gpt4 book ai didi

opengl-es - 如何在 GLSL 中编写片段着色器来对 9 个 float 的数组进行排序

转载 作者:行者123 更新时间:2023-12-04 00:40:20 27 4
gpt4 key购买 nike

我正在编写一个片段着色器,以便将 9 个图像放在一起。

我以前从未使用过 GLSL,但它似乎是完成这项工作的正确工具,因为 OpenCL 在 iOS 上不可用,而且 CPU 上的中值处理效率低下。这是我到目前为止所拥有的:

uniform sampler2D frames[9];
uniform vec2 wh;

void main(void)
{
vec4 sortedFrameValues[9];
float sortedGrayScaleValues[9];

for (int i = 0; i < 9; i++)
{
sortedFrameValues[i] = texture2D(frames[i], -gl_FragCoord.xy / wh);
sortedGrayScaleValues[i] = dot(sortedFrameValues[i].xyz, vec3(0.299, 0.587, 0.114));
}

// TODO: Sort sortedGrayScaleValues

float gray = sortedGrayScaleValues[4];
gl_FragColor = vec4(gray, gray, gray, 0);
}

最佳答案

有点晚了,但我发现最快的方法是插入排序。降低着色器的复杂性和分歧是关键。 Bitonic 和 bubble 对于小数字也很有效。一旦达到 100 左右,就切换到归并排序。

因为您知道要排序的事物的数量 (9),所以最好的选择是排序网络。你可以使用 this handy tool生成它...

There are 27 comparators in this network,
grouped into 11 parallel operations.

[[0,1],[2,3],[4,5],[7,8]]
[[0,2],[1,3],[6,8]]
[[1,2],[6,7],[5,8]]
[[4,7],[3,8]]
[[4,6],[5,7]]
[[5,6],[2,7]]
[[0,5],[1,6],[3,7]]
[[0,4],[1,5],[3,6]]
[[1,4],[2,5]]
[[2,4],[3,5]]
[[3,4]]

一个方便的使用方法是声明一个比较和交换宏...

#define CMP(a, b) ...
#define SWAP(a, b) ...
#define CSWAP(a, b) if (CMP(a, b)) {SWAP(a, b);}

CSWAP(0, 1); CSWAP(2, 3); ...

结合这两种方法,一个排序网络可以快速对小数据 block 进行排序,然后在有很多 block 的情况下进行合并排序,效果非常好,如 Fast Sorting for Exact OIT of Complex Scenes 中所述。 (免责声明:我是作者)。展开循环(实质上创建一个排序网络)可能特别有益,允许在寄存器中排序。动态索引数组放置在速度较慢的本地内存中。要强制编译器不这样做,您可以手动声明 vec4 array0, array1 ... .宏可以连接在这里很有用的文本 #define CMP(a, b) (array##a < array##b) .一个相当丑陋但快速的例子是 here .

关于opengl-es - 如何在 GLSL 中编写片段着色器来对 9 个 float 的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19440389/

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