2017-06-27 4 views
0

Golang gomobile exemple de base [1] utilise VertexAttribPointer pour définir 3 x FLOATS par sommet.Pourquoi l'exemple de base golang gomobile définit-il la taille 3-float pour un attribut vec4?

Toutefois, le type d'attribut vertex shader est vec4. Ne devrait-il pas être vec3?

Pourquoi?

Dans la boucle rendre:

glctx.VertexAttribPointer(position, coordsPerVertex, gl.FLOAT, false, 0, 0) 

données Triangle:

var triangleData = f32.Bytes(binary.LittleEndian, 
    0.0, 0.4, 0.0, // top left 
    0.0, 0.0, 0.0, // bottom left 
    0.4, 0.0, 0.0, // bottom right 
) 

déclaration constante:

const (
    coordsPerVertex = 3 
    vertexCount  = 3 
) 

Dans vertex shaders:

attribute vec4 position; 

[1] gomobile exemple de base: https://github.com/golang/mobile/blob/master/example/basic/main.go

Répondre

1

Les attributs de sommet sont toujours des vecteurs à 4 composantes. Il n'y a aucune exigence que le nombre de composants que vous utilisez dans le shader et celui que vous avez configuré pour le pointeur d'attribut doivent correspondre. Si votre tableau a plus de composants que votre shader ne consomme, les composants supplémentaires sont juste ignorés. Si votre tableau fournit moins de composants, l'attribut est rempli à un vecteur du formulaire (0,0,0,1) (ce qui est logique pour les vecteurs de position homogènes ainsi que pour les couleurs RVBA).

Dans le cas habituel, vous voulez w=1 pour chaque position d'entrée de toute façon, il n'est pas nécessaire de stocker cela dans un tableau. Mais vous avez généralement besoin du formulaire 4D complet lors de l'application des matrices de transformation (ou même lorsque vous transmettez directement la valeur sous la forme gl_Position). Ainsi, votre shaders pourrait théoriquement faire

in vec3 pos; 
gl_Position=vec4(pos,1); 

mais ce serait l'équivalent de l'écriture juste

in vec4 pos; 
gl_Position=pos;