金属计算内核规模映像



我有点困惑,在使用计算着色器时如何在输出纹理中应用缩放操作。例如

kernel void testCompute   (texture2d<half, access::read>  inputTexture  [[ texture(0) ]],
texture2d<half, access::write> outputTexture [[ texture(1) ]],
uint2 gid [[thread_position_in_grid]])
{
if ((gid.x >= inputTexture.get_width()) || (gid.y >= inputTexture.get_height())) {
return;
}
half4 inputColor = inputTexture.read(gid);
half4 outputColor = half4(inputColor.r, 0.0, inputColor.b, 1.0);
outputTexture.write(outputColor, gid);  
}

上面的计算着色器是否假定输入和输出纹理的大小相等?如果我使用顶点和片段着色器,我可以使用 filter::linear 配置采样器,输出纹理会根据其大小进行缩放。我们如何使用计算着色器实现同样的事情?

计算着色器不会对纹理做出任何假设。

应用代码确定计算着色器在调度时在其上运行的网格的大小。网格是一个抽象的概念。它不一定与其他任何事情有关。这取决于您如何解释/赋予网格意义。

网格中的每个位置都会调用一次着色器,并且可以将位置提供给着色器函数,就像您使用gid参数排列的那样。

由于着色器的编码方式,着色器将位置解释为输入纹理中的坐标(因为将其传递给read()函数)和输出纹理中的坐标(因为将其传递给write()函数)。因此,正如当前编写的那样,着色器不会缩放图像。它假设输出纹理至少与输入一样大,并且它只是将输入复制到输出的左上角。

如果要执行缩放,通常会使网格的大小与输出纹理的大小相同,以便为网格中的每个纹素计算一些内容。然后,您必须显式缩放位置以从输入纹理中的相应位置读取。实际上,如果要过滤,则需要对输入纹理进行采样,而不仅仅是读取。

要执行位置缩放,您可以使用两个纹理的大小。

最新更新