gpt4 book ai didi

metal - 如何在 Metal 片段着色器中实现/使用原子计数器?

转载 作者:行者123 更新时间:2023-12-04 23:38:18 25 4
gpt4 key购买 nike

我想在我的 Metal 应用程序中实现一个 A-Buffer 算法来实现与订单无关的透明度。该技术的描述提到使用原子计数器。我从未使用过其中之一,甚至没有听说过。我刚刚阅读了 Metal Shading Language Specification 中的原子变量,但我不知道如何实际实现或使用一个。

有没有人在 Metal 中有这些经验?你能指出一个如何设置和使用简单整数计数器的例子吗?基本上每个渲染 channel 我都需要能够从片段着色器中增加一个整数,从零开始。这用于索引到 A 缓冲区。

谢谢!

最佳答案

好吧,你的问题缺乏足够的细节来提供比一般概述更多的内容。您可能会考虑添加一个不完整的着色器函数,其中包含您不确定如何实现某些内容的伪代码。

无论如何,原子计数器是 atomic_uint 类型的变量(或 atomic_int 如果您需要签名)。为了有用,变量需要在特定的地址空间中共享。您的示例听起来需要 device地址空间。所以,你会想要一个 device由缓冲区支持的变量。您可以将其声明为:

fragment FragmentOut my_fragment_func(device atomic_uint &counter [[buffer(0)]], ...)
{
...
}

您还可以为参数使用结构类型,并将结构的字段作为您的 atomic_uint多变的。

要将原子变量原子地增加 1 并获得先验值,您可以这样做:
    uint value = atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed);

原子变量的初始值是在执行 draw 或 dispatch 命令之前从缓冲区的内容中获取的。规范中没有这样记录,但原子类型的大小和位解释似乎与相应的非原子类型相匹配。也就是说,你会写一个 uint (又名 unsigned intuint32_t )到缓冲区以初始化 atomic_uint .

关于metal - 如何在 Metal 片段着色器中实现/使用原子计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47213979/

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