I tried to test a simple scene exported from Unity3D in my iPhone. However, I find that some float4 variables are automatically converted to half4. This is my shader code in Unity: Code (CSharp): struct VertexInput { float4 vertex : POSITION; half3 normal : NORMAL; half4 tangent : TANGENT; float2 uv0 : TEXCOORD0; float2 uv1 : TEXCOORD1; #if defined(USE_UV2) float2 uv2 : TEXCOORD2; #endif #if defined(USE_TREE_ANIMATION) float4 uv2 : TEXCOORD2; float4 uv3 : TEXCOORD3; #endif #if defined(USE_VERTEX_COLOR) fixed4 vertexColor : COLOR; #endif UNITY_VERTEX_INPUT_INSTANCE_ID }; And when I test my scene in XCode: Why does Metal convert my float4 type to half4?