2017-01-26 2 views
-2

Je veux programmer un shader et je la position d'un sommet et 3 matrices:Comment calculer world_position dans Shader

  • mat4 matrice modèle-vue-projection
  • mat4 transformation mondiale du modèle
  • mat3 transformation mondiale pour Normales

La sortie doit être

vec3 world_position 

Comment puis-je calculer cela?

+0

Si votre « transformation du monde du modèle » est une transformation du modèle de l'espace à l'espace mondial, est-ce pas juste une question d'utiliser cette transformation? 'world_transform * in_vertex' – Frank

Répondre

-2

Multiplier la position du sommet en tant que vec4 (pos, 1.0f) avec la matrice modèle-vue-projection pour obtenir les coordonnées du monde.

Par exemple,

vec4 world_vertex = mvp_transform * vec4(vertexPosition, 1.0f); 

vec3 world_position = world_vertex.xyz; 

EDIT

Toutes mes excuses pour la lecture de la question fugitive. J'ai supposé la multiplication de mvp parce que c'est la transformation typique nécessaire avant que le shader de fragment soit appelé. Comme OP l'a mentionné, la position du sommet devrait être multipliée par la matrice du modèle.

+2

Après le model-view-projection, vous êtes dans l'espace du clip. L'espace du monde est juste après l'application de la matrice du modèle. Peut-être que la transformation du monde parle de, mais qui sait. – BDL

+0

Je suppose que c'est la matrice de transformation mondiale (malheureusement il n'y a pas de documentation). Je pense juste qu'il est étrange que la matrice de transformation mondiale soit mat4 mais la world_position est une vec3 – Peter111

+1

Je ne vois rien d'étrange avec ça. Sauf si vous utilisez des coordonnées homogènes '[world_position, 1]', il est impossible de gérer les traductions. C'est aussi la raison pour laquelle world_matrix est un mat4 alors que normal_matrix est un mat3: Les normales n'ont pas besoin d'être traduites, juste retournées. – BDL

1

La réponse était:

vec4 world_vertex = model_matrix * vec4(vertexPosition, 1.0f); 

vec3 world_position = world_vertex.xyz;