“位置”周围的双方括号在Metal语言中意味着什么?

时间:2017-05-08 18:54:00

标签: syntax metal

float4 position [[position]];在以下代码段中做了什么?

#include <metal_stdlib>
using namespace metal;

struct Vertex
{
    float4 position [[position]];
    float4 color;
};

vertex Vertex vertex_main(device Vertex *vertices [[buffer(0)]], uint vid [[vertex_id]])
{
    return vertices[vid];
}

我对[[position]]部分以及函数定义中的类似用法感到困惑。

4 个答案:

答案 0 :(得分:4)

金属着色语言记录在https://developer.apple.com/metal/metal-shading-language-specification.pdf

特别注意&#34;表9&#34;在该文件的第68页上。 [[position]]被识别为顶点函数的返回类型的属性限定符。我假设这意味着当您的顶点着色器返回调用者时,将使用结构的该部分中的值来确定着色器想要修改的顶点的位置。

答案 1 :(得分:1)

我没有足够的声誉来回复您对括号名称的评论,但[[]]括号是从C ++ 11中获取的属性语法。

答案 2 :(得分:1)

Metal基于C ++,这只是C ++ 11中属性的语法。有关语法的更多详细信息,请参阅this

答案 3 :(得分:0)

因此,您拥有的是一个顶点着色器,该顶点着色器的输出(在本例中为struct Vertex)进入光栅化器,而光栅化器的输出进入片段着色器。

顶点着色器->光栅化器->片段着色器

光栅化器对您输入的任何内容进行插值,这仅意味着它会将这些值平均化。这里的要点是您不控制此过程(我的意思是光栅化器),它只是做它的事情……它将输出输出到片段着色器,然后您可以用它做任何您想做的事情。

这里的[[position]]仅标记位置值,因此光栅化器不要触摸它。它将触摸并插值其他所有内容。

如果您不将位置命名为“ position”,而是将其命名为“ blah”并用[[position]]标记,则它将“ blah”解释为“ position”,并且将其保留下来