如何在金属着色器语言中使用引用的参数定义函数,顶点,片段和内核函数除外

时间:2019-02-13 08:47:09

标签: metal

将一些基本的OpenGL ES 2.0着色器移植到Metal着色器时,我不知道如何将glsl中的in /​​ inout / out限定符转换为Metal Shader语言(MSL)。例如,

=IF(AND(RC[-8]<>"",OR(RC[1]="",RC[10]="")),TRUE,FALSE)

当尝试转换为MSL时,我尝试在getPositionAndNormal参数中使用引用:

//OpenGL vertex shader

...

void getPositionAndNormal(out vec4 position, out vec3 normal, out vec3 tangent, out vec3 binormal)
{
    position = vec4(1.0, 0.0, 1.0, 1.0);
    normal = vec3(1.0, 0.0, 1.0);
    tangent = vec3(1.0, 0.0, 1.0);
    binormal = vec3(1.0, 0.0, 1.0);
}

void main()

{
    ...

    vec4 position;
    vec3 normal;
    vec3 tangent;
    vec3 binormal;
    getPositionAndNormal(position, normal, tangent, binormal);

    ...
}

我得到以下编译错误信息:void getPositionAndNormal(float4 & position, float3 & normal, float3 & tangent, float3 & binormal);

根据Metal-Shading-Language-Specification.pdf中的第4.2节,我使用设备地址空间以下列形式引用getPositionAndNormal参数:

reference type must have explicit address space qualifier

这一次,我收到的错误消息是没有匹配的函数来调用“ getPositionAndNormal”。

void getPositionAndNormal(device float4 & position, device float3 & normal, device float3 & tangent, device float3 & binormal);

什么是正确的“金属”方式?

1 个答案:

答案 0 :(得分:1)

vertexShader()中的局部变量位于thread地址空间中,而不是device地址空间中。因此,您也应该将getPositionAndNormal()的参数声明为thread地址空间。

device地址空间用于跨设备共享的内容;也就是说,在着色器的所有“线程”或调用中。这些变量特定于每个线程/调用。他们没有共享。

我怀疑完整的“不匹配函数”编译器错误可能会解释声明的参数与实际传递的参数之间的不匹配,尽管可能有些含糊。