【问题标题】:Why are there two brackets [ in the c++ vertex functions?为什么 C++ 顶点函数中有两个括号 [?
【发布时间】:2017-04-19 04:23:40
【问题描述】:

我正在观看 Apple 关于 Metal 和 MetalKit 的介绍视频。

着色器的示例代码包含这些双括号,例如 [[buffer(0)]] 参数。为什么有两个括号?这是什么意思,还是只是表明后面有关键字“缓冲区”?标准 c++ 中没有这样的构造,是吗?

vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]],
                              constant Uniforms &uniforms [[buffer(1)]],
                              uint vid [[vertex_id]])

另外,作为 GP-GPU 简介的 1 或 2 周有趣的项目是什么?对于具有良好数学技能但没有艺术技能的新手来说,这是可以管理的。

【问题讨论】:

  • 是的,这是标准语法。 en.cppreference.com/w/cpp/language/attributes
  • 另外,我写的用于操场的无耻插件,如果您刚刚学习如何使用 Metal,这可能会有所帮助:github.com/jtbandes/Metalbrot.playground
  • 哦,所以它是一个属性,它只是说明在哪里可以找到顶点变量。唤醒大脑。我太沉迷于双 [。不过,知道他们为什么选择两个 [ 而不是一个?
  • 可能是为了避免使用常规数组下标语法产生歧义。 int x[length];int x[[some_attr]];.
  • 可能。仍然在函数头中,我希望有更多的 doStuff([int] x) 或 doStuff(x: [Int]) 而不是 doStuff(int x[length])。这甚至意味着什么?再说一次,我也是 C++ 的新手。如果你把你的答案放在回复中,我会投赞成票。

标签: c++ shader metal metalkit


【解决方案1】:

有了这个 [[ x ]],你声明了在着色器和 CPU 之间传递的 att

我引用:

[[ … ]] 语法用于声明资源等属性 位置、着色器输入和传回的内置变量 在着色器和 CPU 之间来回切换

【讨论】:

  • 报价从何而来?请说明。
【解决方案2】:

这些被称为属性,它们的语法和行为在C++标准的第7.6.1节属性语法和语义中定义。它们在语法中看起来像这样:

attribute-specifier:
    [ [ attribute-list ] ]
    alignment-specifier

Metal 着色语言定义了许多属性,允许您将各种语义与变量、struct/class 成员和函数参数(包括您的问题中的参数表绑定)相关联。

Metal Shading Language Specification 在这方面遵循 C++ 标准,因此 C++ 标准确实是参考参考:

Metal 编程语言基于 C++14 规范 (又名 ISO/IEC JTC1/SC22/WG21 N4431 语言规范) 具有特定的扩展和限制。请参考 C++14 语言语法的详细描述规范。

【讨论】:

  • 还要补充一点,提到的[[buffer(0)]] 参数是由渲染命令编码器创建的。它设置了要发送到着色器的资源参数表:developer.apple.com/library/prerelease/content/documentation/…,因此它可以设置缓冲区、纹理和采样器状态以通过下标引用,就像 buffer[0]buffer[1] 一样。跨度>
  • 参数属性标识当前绘制调用或计算命令时在渲染命令编码器上设置的相应缓冲区对象的资源“槽”。
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2011-08-14
  • 2017-01-10
相关资源
最近更新 更多