Je m'intéresse à un programme C++ OpengL et des shaders GLSL Vertex et Fragment.Calcul d'un correctif de traduction depuis la position directement dans le shader avec GLSL
Je crée plusieurs instances du même objet. Je dois juste changer la position de l'objet entre les instances.
Voici ce que j'ai fait: Je travaille avec une variable uniforme qui est un tableau de matrice de transformation. Chaque matrice représente une instance d'objet. MVP est également une matrice de transformation, mais MVP est défini par la position, l'orientation et les propriétés de la caméra.
Voici mon vertex shader:
#version 330 core
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;
uniform mat4 object_positions[20];
out vec3 fragment_color;
uniform mat4 MVP;
void main()
{
gl_Position = object_positions[gl_InstanceID] * MVP * vec4(vertex_position,1.0);
fragment_color = vertex_color;
}
Voici ce que je dois faire en C++ programme pour définir les positions des objets:
glm::mat4 object_positions[20];
object_positions[0] = glm::translate(glm::mat4(1), glm::vec3(0.4f,0.2f,0.0f));
object_positions[1] = glm::translate(glm::mat4(1), glm::vec3(0.5f,1.4f,0.0f));
...
object_positions[19] = glm::translate(glm::mat4(1), glm::vec3(-10.6f,0.2f,0.0f));
GLuint object_positions_id = glGetUniformLocation(program_id, "object_positions");
...
glUniformMatrix4fv(object_positions_id, 7, GL_FALSE, glm::value_ptr(object_positions[0]));
Le vec3 vous voyez comme deuxième argument de GLM :: translate contient la position de chaque objet. Tout fonctionne bien à ce stade.
Ce que je veux faire est de calculer glm :: translte dans shader. Ce que je veux en fait c'est d'envoyer un vec3 au lieu d'un mat4 pour chaque position. Je veux que le GPU calcule la matrice de transformation au lieu du CPU. Tout ce que j'ai essayé ne fonctionne pas.
Merci
Non, il ne fonctionne pas. C'est exactement le même résultat. object_positions devrait être une matrice de transformation dans ce cas, pas une position – Bob5421
Pourquoi voulez-vous une matrice quand il suffit d'ajouter le décalage est beaucoup plus simple et plus rapide? –
Oui c'est une bonne idée mais que dois-je mettre dans w? – Bob5421