我正在将一些基本的OpenCL代码移植到Metal计算着色器。尝试转换其他辅助函数时,很早就陷入困境。例如,在.metal文件Xcode(7.1)中包含类似以下函数的内容,将给我“没有先前的函数原型(prototype)”警告

float maxComponent(float4 a) {
    return fmax(a.x, fmax(a.y, fmax(a.z, a.w)));
}

做到这一点的“Metal ”方式是什么?

最佳答案

我知道的三种方式:

(我将函数重写为重载,并且对我而言更具可读性。)

实际声明原型(prototype):

float fmax(float4 float4);
float fmax(float4 float4) {
   return fmax(
      fmax(float4[0], float4[1]),
      fmax(float4[2], float4[3])
   );
}

将其范围限定为带有静态文件:
static float fmax(float4 float4) {
   return fmax(
      fmax(float4[0], float4[1]),
      fmax(float4[2], float4[3])
   );
}

将其包装在匿名 namespace 中:
namespace {
   float fmax(float4 float4) {
      return metal::fmax(
         metal::fmax(float4[0], float4[1]),
         metal::fmax(float4[2], float4[3])
      );
   }
}

关于ios - Metal 着色器文件中顶点|片段|内核以外的功能的语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33978063/

10-12 07:16