• Advertisement
Sign in to follow this  

Passing a Matrix4 to a Vertex Attribute [Solved]

This topic is 1750 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

So I am looking for a way to pass a Matrix4 from my program into my shader as an attribute.


As for the reason why, I am working on a particle system and every particle requires its own Model matrix so I can do things like per particle rotation.


I know you cannot just do this, because you can only used 1,2,3,4 where the 16 is. I do know I could split this into 4 vectors, but then I have to reassemble on the other side so I would rather not do that.

glVertexAttribPointer(3, 16, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (const GLvoid*)36);



Is there a way to pass this into the shader some way that doesn't involve me adding code to disassemble and reassemble my matrix?



I should add I have a struct that holds the information for each particle so I am using interleaving to pass data.


I also found a code sample that works for non interleaving:


for (unsigned int i = 0; i < 4 ; i++) 
glEnableVertexAttribArray(WVP_LOCATION + i);
glVertexAttribPointer(WVP_LOCATION + i, 4, GL_FLOAT, GL_FALSE, sizeof(Matrix4f), (const GLvoid*)(sizeof(GLfloat) * i * 4));
glVertexAttribDivisor(WVP_LOCATION + i, 1);




As a side note, I am applying my ModelView to a GL_POINT which then gets passed into a Geometry shader, if I apply a rotation to that GL_POINT will it be reflected on the textured triangle strip that comes out the other side.





Just my luck, I spend hours searching for an answer, decide to post and find it within 5 minutes after posting...


I just need to add the offset of 36 to the code above.

Edited by harshman_chris

Share this post

Link to post
Share on other sites

I have never tried it, but I think you can define an attribute in your shader as usual and give it a matrix type. The attribute location of each column of the matrix are numbered consecutively.


In the shader:

in mat4 myMatrix;


In the code:

GLint loc = glGetAttribLocation(program, "myMatrix");
glVertexAttribPointer(loc+0, ...); // first column
glVertexAttribPointer(loc+1, ...); // second column
glVertexAttribPointer(loc+2, ...); // and so on...
glVertexAttribPointer(loc+3, ...);


Never tried it though, so it may be wrong.

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement