将一些基本的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);
什么是正确的“金属”方式?
答案 0 :(得分:1)
vertexShader()
中的局部变量位于thread
地址空间中,而不是device
地址空间中。因此,您也应该将getPositionAndNormal()
的参数声明为thread
地址空间。
device
地址空间用于跨设备共享的内容;也就是说,在着色器的所有“线程”或调用中。这些变量特定于每个线程/调用。他们没有共享。
我怀疑完整的“不匹配函数”编译器错误可能会解释声明的参数与实际传递的参数之间的不匹配,尽管可能有些含糊。