为什么 golang gomobile basic example 为 vec4 属性设置 3-float 大小?

Why does golang gomobile basic example sets 3-float size for a vec4 attribute?

Golang gomobile 基本示例 [1] 使用 VertexAttribPointer 为每个顶点设置 3 x FLOATS。

但是顶点着色器属性类型是vec4。不应该是vec3吗?

为什么?

在渲染循环中:

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

三角形数据:

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
)

常量声明:

const (
    coordsPerVertex = 3
    vertexCount     = 3
)

在顶点着色器中:

attribute vec4 position;

[1] gomobile 基本示例:https://github.com/golang/mobile/blob/master/example/basic/main.go

顶点属性在概念上始终是 4 个分量向量。没有要求您在着色器中使用的组件数量与您为属性指针设置的组件数量必须匹配。如果您的数组包含的组件多于着色器消耗的组件,则多余的组件将被忽略。如果您的数组提供较少的组件,则该属性将填充为 (0,0,0,1) 形式的向量(这对于同质位置向量和 RGBA 颜色有意义)。

在通常情况下,无论如何您都希望每个输入位置都为 w=1,因此无需将其存储在数组中。但是在应用变换矩阵时(或者甚至在直接将值转发为 gl_Position 时),您通常需要完整的 4D 形式。所以你的着色器在概念上可以做

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

但这等同于只写

in vec4 pos;
gl_Position=pos;