0

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

1 回答 1

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;
于 2017-06-28T20:21:33.037 回答