2 Replies
      Latest reply on Nov 23, 2019 2:24 AM by den73
      coulsonwang Level 1 Level 1 (0 points)

        When porting some basic OpenGL ES 2.0 shader to Metal shader, I don't know how to convert the in/inout/out qualifier in glsl to metal shader language(MSL). For example,

         

        //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);

            ...

        }

         

        when attempting convert to MSL, I try to use reference in the getPositionAndNormal  parameters:

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

        I get the following compile error infomation: reference type must have explicit address space qualifier

         

        According to section 4.2 in https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf, I use device address space to reference the getPositionAndNormal parameters in the following forms:

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

         

        This time, the error message I got was no matching function for call to 'getPositionAndNormal'.

        void getPositionAndNormal (

          device float4 & position,

          device float3 & normal,

          device float3 & tangent,

          device float3 & binormal)

        {

          position = float4(1.0, 0.0, 1.0, 1.0);

          normal = float3(1.0, 0.0, 1.0);

          tangent = float3(1.0, 0.0, 1.0);

          binormal = float3(1.0, 0.0, 1.0);

        }

         

        vertex ShaderOutput vertexShader (ShaderInput inputMTL [[stage_in]], constant ShaderUniform& uniformMTL [[buffer(1)]])

        {

          ...

          float3 binormal = 0;

          float3 tangent = 0;

          float3 normal = 0;

          float4 position = 0;

          getPositionAndNormal (position, normal, tangent, binormal);

          ...

        }

         

        What's the right 'metal' way to do this?