Hello
Quelqu'un sait comment passer un attribut de type mat3 à un vertex shader?
J'arrive à passer des vecteurs mais j'aimerais passer une mat3.
Je précise que je parle bien d'attribut et non d'uniform.
Version imprimable
Hello
Quelqu'un sait comment passer un attribut de type mat3 à un vertex shader?
J'arrive à passer des vecteurs mais j'aimerais passer une mat3.
Je précise que je parle bien d'attribut et non d'uniform.
Bonjour,
Dans la spécification, je vois ces belles fonctions :
Code:
1
2
3
4
5
6 void uniform3f(WebGLUniformLocation location, GLfloat x, GLfloat y, GLfloat z); void uniform3fv(WebGLUniformLocation location, Float32Array v); void uniform3fv(WebGLUniformLocation location, float[] v); void uniform3i(WebGLUniformLocation location, GLint x, GLint y, GLint z); void uniform3iv(WebGLUniformLocation location, Int32Array v); void uniform3iv(WebGLUniformLocation location, long[] v);
Je re-précise que je parle bien d'attribut et non d'uniform.
Et non pasCode:
1
2 attribute mat3 aMat3;
Code:
1
2
3
4 uniform mat3 uMat3; varying mat3 vMat3;
:oops:
Pardon. Dans la même spécification :
Dans la spécification du WebGL il réfère à la spécification de OpenGL ES 2 (section 2.7) qui dit :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void vertexAttrib1f(GLuint indx, GLfloat x); void vertexAttrib1fv(GLuint indx, Float32Array values); void vertexAttrib1fv(GLuint indx, float[] values); void vertexAttrib2f(GLuint indx, GLfloat x, GLfloat y); void vertexAttrib2fv(GLuint indx, Float32Array values); void vertexAttrib2fv(GLuint indx, float[] values); void vertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z); void vertexAttrib3fv(GLuint indx, Float32Array values); void vertexAttrib3fv(GLuint indx, float[] values); void vertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void vertexAttrib4fv(GLuint indx, Float32Array values); void vertexAttrib4fv(GLuint indx, float[] values); void vertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);
La commande peut donc aussi être utilisée pour une matrice.Citation:
The VertexAttrib* commands can also be used to load attributes declared as a
2×2, 3×3 or 4×4 matrix in a vertex shader. Each column of a matrix takes up one
generic 4-component attribute slot out of the MAX_VERTEX_ATTRIBS available
slots. Matrices are loaded into these slots in column major order. Matrix columns
need to be loaded in increasing slot numbers.
Je pige pas trop, il me faudrait un exemple.
Est-ce que vous arriver à en trouver un ?
Il faut chercher du coté des demos WebGL, je pense.
Sinon, un programme OpenGL classique est similaire.
Je n'ais jamais coder du WebGL, mais en analogie avec OpenGL en C/C++ (l'original si on puit dire), çà se ferait de cette fasson : (je ne me porte pas garant du resultat mais essaye :ccool:)
le vertex shader:
Le terme "attribute" c'est pour les shaders de version précédente si je ne me trompe pas .... mais si sa fonctionne libre a toi de laisser le "attribute" mais le in est quand même à préféré d'après les spécifications original de GLSL 3.3 (et supérieur)Code:in mat3 aMat3 ;
code a essayer :
Code:
1
2
3
4
5
6 // Matrix un tableau multiple de 9 float vertexAttrib3fv(aMat3Location, Matrix); vertexAttrib3fv(aMat3Location + 1, &Matrix[3]); vertexAttrib3fv(aMat3Location + 2, &Matrix[6]);
Un autre code a essayer mais qui peut causer problème dans le javascript. (c'est une syntaxe C/C++ plus élégante qu'un &Matrix[3] par exemple)
Attention, la je suis parti du principe que tu ramplissai ta matrice colonne par colonne, c'est la plus optimisé pour OpenGL (et donc WebGL aussi je pense).Code:
1
2
3
4
5
6 // Matrix un tableau multiple de 9 float vertexAttrib3fv(aMat3Location, Matrix); vertexAttrib3fv(aMat3Location + 1, Matrix + 3); vertexAttrib3fv(aMat3Location + 2, Matrix + 6);
donc ta matrice ressemble a :
Code:
1
2
3
4 Matrix[0] Matrix[3] Matrix[6] Matrix[1] Matrix[4] Matrix[7] Matrix[2] Matrix[5] Matrix[8]
Mais l'idée est là, ta première colonne de ta matrice ce trouve sur la location usuel de aMat3 que j'ai nommé dans ces bous de code aMat3Location. Ensuite, pour la seconde colonne ce trouve sur aMat3Location + 1 et ainsi de suite.
Désolé de ne pouvoir être plus précis, le js date un peut pour moi. :mrgreen:
Merci, tu as tout à fait raison et je connaissais déjà cela.
Le seul hic, c'est qu'en webGL on n'obtient pas des entiers (pointeurs) vers les attributs mais des "objets" et qu'il n'est pas permet de faire + 1 (ou toute autre opération arithmétique) dessus.
Donc soit khronos n'a pas bien pensé l'accès aux attributs matriciels soit la méthode n'est pas correctement documentée/diffusée.
C'est pas grave, alors essaye de chopé aMat3[0], aMat3[1] et aMat3[2] qui corresponde exactement au colonne 0, 1 et 2 de la matrice.
ensuite tu fait un :
Note que la location aMat3[0] et aMat sont les même, donc que aMat3LocationColomn0 == aMat3LocationCode:
1
2
3 vertexAttrib3fv(aMat3LocationColomn0, Matrix); vertexAttrib3fv(aMat3LocationColomn1, Matrix + 3); vertexAttrib3fv(aMat3LocationColomn2, Matrix + 6);