Metal 在金属着色器中使用[[clip_distance]]属性?

Metal 在金属着色器中使用[[clip_distance]]属性?,metal,Metal,在金属着色器中,我尝试在顶点着色器函数的输出结构中使用[[clip_distance]]属性,如下所示: struct vtx_out { float4 gl_Position [[position]]; float gl_ClipDistance[1] [[clip_distance]]; }; 但是,这会导致以下着色器编译错误: <program source>:86:32: error: 'clip_distance' attribute cannot be

在金属着色器中,我尝试在顶点着色器函数的输出结构中使用[[clip_distance]]属性,如下所示:

struct vtx_out
{
    float4 gl_Position [[position]];
    float gl_ClipDistance[1] [[clip_distance]];
};
但是,这会导致以下着色器编译错误:

<program source>:86:32: error: 'clip_distance' attribute cannot be applied to types
    float gl_ClipDistance[1] [[clip_distance]];
                               ^
:86:32:错误:“剪辑距离”属性无法应用于类型
浮动gl_ClipDistance[1][[clip_distance]];
^
我正在试图编译这个,以便在运行OS X El Capitan的Mac上运行

为什么会出现此错误,以及如何使用[[clip\u distance]]属性?

使用此选项:

struct vtx_out
{
  float4 gl_Position [[position]];
  float gl_ClipDistance [[clip_distance]] [1];
};
在金属着色语言中,距离是一个声明属性。 C++规范>代码> [DCL .ARD] < /C> >状态:

在声明T D中,其中D的形式为

D1[常量表达式pt]属性说明符seqopt

。。。可选属性说明符seq与数组关联

这就是为什么将属性放在末尾会使Clang将其视为类型属性,并且您会看到错误。

使用以下方法:

struct vtx_out
{
  float4 gl_Position [[position]];
  float gl_ClipDistance [[clip_distance]] [1];
};
在金属着色语言中,距离是一个声明属性。 C++规范>代码> [DCL .ARD] < /C> >状态:

在声明T D中,其中D的形式为

D1[常量表达式pt]属性说明符seqopt

。。。可选属性说明符seq与数组关联


这就是为什么将属性放在末尾会使Clang将其视为类型属性,并且您会看到错误。

这与您所看到的错误正交,但是您如何将用户剪辑平面设置为float4,或者在着色器中生成,或者作为统一体传入,取决于用例。这与您得到的错误正交,但您如何将用户剪辑平面设置为浮动4,在着色器中生成,或作为统一体传入,具体取决于用例。效果很好。谢谢工作起来很有魅力。谢谢