[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct Vertex { public Vector3 BeginPos; public Vector3 EndPos; public Vector4 Adjuster; public Color Color; public Vector3 Normal0; public Vector4 Normal1; } publicstatic VertexAttributeDescriptor[] Layout = new[]{ new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.TexCoord1, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord2, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Tangent, VertexAttributeFormat.Float32, 4), };
Asset としての Mesh をいじる場合は、シリアライズしたりする必要もあって、従来の API を使うべきなのでは?と思ったのだ。マニュアルにそうしろとは書いてなかったが(伏線)。
飯食って、そろそろ寝るかと落ち着いた時に、「まさか」と思って試したらうまくいったのが次のコード。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct Vertex { public Vector3 BeginPos; public Vector3 Normal0; public Vector4 Normal1; public Vector3 EndPos; public Vector4 Adjuster; public Color Color; } publicstatic VertexAttributeDescriptor[] Layout = new[]{ new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Tangent, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.TexCoord1, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord2, VertexAttributeFormat.Float32, 4), };