在iOS或OS / X中,Metal Shader Language内核函数使用了什么纹理坐标?例如,假设MTLTexture
和uint2 gid[[thread_position_in_grid]]
为gid.x
且gid.y
介于0..1(x和y为浮点数)或0 .. inTexture.get_width()
( x和y是整数)。
先谢谢
答案 0 :(得分:6)
thread_position_in_grid
是网格中的索引(整数),它采用您在dispatchThreadgroups:threadsPerThreadgroup:
中指定的范围中的值。由你来决定你想要多少线程组,以及每组有多少线程。
在以下sample code中,您可以看到threadsPerGroup.width * numThreadgroups.width == inputImage.width
和threadsPerGroup.height * numThreadgroups.height == inputImage.height
。在这种情况下,网格中的位置因此将是非标准化(整数)像素坐标。
答案 1 :(得分:4)
每次在Metal中启动计算着色器时都会有一个密集的矩形3D网格线程ID。当您致电[MTLComputeCommandEncoder dispatchThreadGroups:threadsPerThreadgroup:]
时,会设置网格的尺寸。例如,您可以将线程组大小设置为{16,16,1}
(线程组中的256个线程为16x16x1平方),线程组计数为{1,2,1}
,这将导致启动两个线程组,总区域为512形状为{16,32,1}
的线程。这些是作为[[thread_position_in_grid]]
出现在内核顶部的整数。线程位置是您告诉哪个线程的方式,就像dispatch_apply()
传递给块的threadID参数一样。
Metal指定从[[thread_position_in_grid]]
到纹理中的坐标的映射。这是由您在计算着色器中的软件中完成的。如果要在图像中的某个偏移处读取纹理区域中的每个其他像素,则需要将threadID乘以2并在将新坐标传递给texture2d.sample
之前在内核中添加偏移量。由于Metal无法启动部分线程组,因此您需要确保不执行不需要的线程组。例如,当应用于较小的纹理时,32x64启动的完整大小可能会导致您注销纹理的末尾。在这种情况下,您必须检查threadID以查看线程是否将注销结束,然后返回着色器或跳过该线程的纹理写入调用以避免此问题。
答案 2 :(得分:-1)
thread_position_in_grid
总是由无符号整数组成,并提供这些选项,但它们都不与纹理坐标相关。提出另一个相关问题可能会有所帮助,因为您似乎正在混淆纹理和内核函数的概念。