为什么golang gomobile基本示例为vec4属性设置3-float大小?

时间:2017-06-27 22:20:56

标签: opengl go glsl shader gomobile

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

1 个答案:

答案 0 :(得分:2)

顶点属性在概念上总是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;