title: Passing custom vertex structure to GLSL shaders
body: <p>I'm trying to pass a structure to a simple GLSL vetrex shader.
  Here's how the structure look like on the C++ side:</p>
  
  <pre><code>struct Vertex
  {
      float position[3];
      char boneIndex[4];
      float weights[4];
      float normals[3];
      float textureCords[2];
  };
  </code></pre>
  
  <p>Is it possible to pass array of this vertex to the vertex shader without creating a separate array for each component?</p>
  
  <p>Can I do something like this:</p>
  
  <pre><code>#version 330 core
  
  uniform mat4 MVP;
  
  layout(location = 0) in struct Vertex
  {
      vec3 position;
      uint boneIndex;
      vec4 weights;
      vec3 normals;
      vec2 textureCords;
  } vertex;
  
  out vec2 UV;
  
  void main()
  {
      gl_Position =  MVP * vec4(vertex.position, 1.0f);
      UV = vertex.textureCords;
  }
  </code></pre>
  
  <p>(Dont mind that not all of the components are in use, it's just for the example.)</p>
  
  <p>And if I can, how can I pass the data to it from the C++ side using the glVertexAttribPointer() function? (According to my understanding you can pass only 1,2,3,4 to the <strong>size</strong> parameter).</p>
  
  <p>Is it the even the right way to do things?
  I'm a beginner in OpenGL programming so if you have an answer please don't hesitate to include obvious details.</p>
  
  <h2>Edit:</h2>
  
  <p>I ended up doing something like this: </p>
  
  <pre><code>    glEnableVertexAttribArray(0);
      glEnableVertexAttribArray(1);
      glEnableVertexAttribArray(2);
      glEnableVertexAttribArray(3);
      glEnableVertexAttribArray(4);
  
      glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
  
      glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);  //float position[3]
      glVertexAttribPointer(1, 1, GL_INT, GL_FALSE, 12, (void*)0);    //char boneIndex[4]
      glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 16, (void*)0); //float weights[4]
      glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 32, (void*)0); //float normals[3]
      glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, 44, (void*)0); //float textureCords[2]
  
  
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indiceBuffer);
  
      glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, (void*)0);
  
      glDisableVertexAttribArray(0);
      glDisableVertexAttribArray(1);
      glDisableVertexAttribArray(2);
      glDisableVertexAttribArray(3);
      glDisableVertexAttribArray(4);
  </code></pre>
  
  <p>On the C++ size, and on the GLSL vertex shader:</p>
  
  <pre><code>    #version 330 core
  
  uniform mat4 MVP;
  
  layout(location = 0) in vec3 position;
  layout(location = 1) in int boneIndex;
  layout(location = 2) in vec4 weight;
  layout(location = 3) in vec3 normal;
  layout(location = 4) in vec2 UVCords;
  
  out vec2 UV;
  
  void main()
  {
      gl_Position =  MVP * vec4(position, 1.0f);
      UV = UVCords;
  }
  </code></pre>
  
  <p>But it still won't work, the model wont render correctly</p>