I am trying to pass a structure into a simple Vetrex GLSL shader. Here's what the structure looks like on the C ++ side:
struct Vertex
{
float position[3];
char boneIndex[4];
float weights[4];
float normals[3];
float textureCords[2];
};
Is it possible to transfer an array of this vertex to the vertex shader without creating a separate array for each component?
Can I do something like this:
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;
}
(Do not remember that not all components are used, this is just an example.)
And if I can, how can I pass data to it from the C ++ side using the glVertexAttribPointer () function? (In my opinion, you can only pass 1,2,3,4 to the size parameter ).
Is this even the right way to do something? I am new to OpenGL programming, so if you have an answer, please feel free to include the obvious details.
Edit:
I ended up doing something like this:
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);
glVertexAttribPointer(1, 1, GL_INT, GL_FALSE, 12, (void*)0);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 16, (void*)0);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 32, (void*)0);
glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, 44, (void*)0);
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);
++ GLSL:
#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;
}
,