什么是Apple的Metal(金属着色器语言)纹理坐标?

时间:2016-01-19 01:23:33

标签: ios 3d scenekit metal

在iOS或OS / X中,Metal Shader Language内核函数使用了什么纹理坐标?例如,假设MTLTextureuint2 gid[[thread_position_in_grid]]gid.xgid.y介于0..1(x和y为浮点数)或0 .. inTexture.get_width()( x和y是整数)。

先谢谢

3 个答案:

答案 0 :(得分:6)

thread_position_in_grid是网格中的索引(整数),它采用您在dispatchThreadgroups:threadsPerThreadgroup:中指定的范围中的值。由你来决定你想要多少线程组,以及每组有多少线程。

在以下sample code中,您可以看到threadsPerGroup.width * numThreadgroups.width == inputImage.widththreadsPerGroup.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总是由无符号整数组成,并提供这些选项,但它们都不与纹理坐标相关。提出另一个相关问题可能会有所帮助,因为您似乎正在混淆纹理和内核函数的概念。

  • 16-或-32位
  • 1D,2D或3D
相关问题