gpt4 book ai didi

metal - 内核中的像素坐标、纹理坐标和 gid

转载 作者:行者123 更新时间:2023-12-04 15:08:21 28 4
gpt4 key购买 nike

假设我有一个大小为 100 的纹理宽度和 100高度并将其分派(dispatch)到 {10, 10, 1} 中的内核函数线程组和大小。

我无法理解 thread_position_in_grid从 0 - 9 或 0 - 99 (因为我的纹理大小是 100 x 100)?

我正在使用 float4 c = in.read(gid);检索纹理的颜色,但我想知道如何gid映射到纹理坐标以检索 float4 类型的结果(会不会有像素(纹理?)坐标之间的情况?)。

我想深入了解上面的工作原理,因为我想要实现的是能够检索内核函数中纹理大小定义的确切位置; IE。:

发货尺寸:{10, 10, 1}和纹理大小 100 x 100;并在核函数中检索值:

0、1、2、3、4、5...、99。

综上所述,gid 怎么样? , texture coordinatespixel coordinates与核函数相关?它们如何从一个映射到另一个?在过去的 4 天里,我一直在阅读文档和类似的问题,但我没有成功获得具体和权威的答案。

谢谢你。

最佳答案

在您的示例中,您正在调度这样的工作网格:

MTLSize threadsPerThreadgroup = { 10, 10, 1 };
MTLSize threadgroupCount = { 10, 10, 1 };
[computeEncoder dispatchThreadgroups:threadgroupCount
threadsPerThreadgroup:threadsPerThreadgroup];

您的 gid , 带有属性 thread_position_in_grid , 可能是 uint2 类型,因为网格的域是二维的。到现在为止还挺好。
gid范围从 (0, 0) 到 (99, 99)。如何将其映射到其他数量,包括纹理坐标,完全取决于您。

例如,假设您不是在对 100x100 纹理进行操作,而是对 300x300 纹理进行操作,并且您想在右下角执行一些操作。在这种情况下,您可以添加 uint2(200, 200)gid在读取/写入纹理之前,为了寻址坐标为 (200, 200) 到 (299, 299) 的像素区域。其他的任意变换也是尽可能的。

基本上,指定网格尺寸是一种方便的方式来描述您要执行的操作的逻辑形状,同时(通过 threadsPerThreadgroup )允许您优化可以并行执行的工作量。

至于(标准化)纹理坐标,在网格尺寸与纹理尺寸完全匹配的简单情况下,您可以通过除以 [[threads_per_grid]] 限定的参数来获得与内核函数调用相对应的标准化坐标。属性,记得先转换以避免截断:
float2 coords = gid / float2(tpg)

在哪里 tpg是您的内核函数的另一个参数,声明为 uint2 tpg [[threads_per_grid]] .

关于metal - 内核中的像素坐标、纹理坐标和 gid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494816/

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