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]]
部分以及函数定义中的类似用法感到困惑。
答案 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”,并且将其保留下来