6

我正在观看 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 周有趣的项目?对于具有良好数学技能但没有艺术技能的新手来说,这是可以管理的。

4

2 回答 2

7

这些被称为属性,它们的语法和行为在 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 规范。

于 2016-12-05T18:45:42.240 回答
3

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

我引用:

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

于 2016-12-04T20:11:18.997 回答