顶点指针中的不安全指针



我一直在学习golang,并有以下片段:

import(
"github.com/go-gl/gl/v3.3-core/gl"
)
vertices := []float32{
// Position // Colors // Texture Coords
1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, // Top Right
1.0, -1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, // Bottom Right
-1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Bottom Left
-1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, // Top Left
}
vlen := int32(len(vertices) * 4 / 4)
var offset uint32 = 0
//position
gl.VertexAttribPointer(0, 3, gl.FLOAT, false, vlen, nil)
gl.EnableVertexAttribArray(0)
//color
offset = offset + 12
gl.VertexAttribPointer(1, 3, gl.FLOAT, false, vlen, unsafe.Pointer(&offset))
gl.EnableVertexAttribArray(1)
offset = 0

所以我得到了我一直在研究的基本正方形——VertexAttribPointer 的第 5 个位置参数中的 nil 似乎有效,但在更大的程序中我没有得到任何颜色。如果我尝试为poistion指定一个偏移不安全的指针0,我只会得到空白空间。

指定一个不安全的指针是我目前不理解的 - 我想我需要指定颜色偏移在顶点中的位置,但我没有遵循。我也不确定 vlen 是否正确。任何意见都值得赞赏。

编辑:

自我找到的解决方案 - 我需要的是gl。PtrOffset,我在最初创建问题时并不知道。

gl.VertexAttribPointer(1, 3, gl.FLOAT, false, vlen, gl.PtrOffset(offset))

你的问题来自VertexAttribPointer(att, size, type, normalized, stride, pointer)

大小是每个通用顶点属性的组件数。位置和颜色有 3 个分量,纹理坐标只有 2 个。
步幅是要在着色器中读取的属性的两个连续值之间的字节偏移量。

您的缓冲区是PPPCCCTT,PPPCCCTT等(即位置,颜色,纹理坐标,位置,颜色,纹理坐标等)。让我们把它放在字节中("浮点数"的大小为 4 字节): 444
444 44, 444 444 44, 等等

详细尺寸步幅: 位置:3 个浮点
数,(3x4 +2x4)=20 字节、3浮点数、20个字节等
颜色:3个浮点数,(2x4 + 3x4)=20字节、3个浮点数、20个字节等
TextCoo:2个浮点数,(3x4 + 3x4)=24 个字节、2个浮点数、24个字节等

位置属性:VertexAttribPointer(att1, 3, gl.FLOAT, false, 20, nil)
颜色属性:VertexAttribPointer(att2, 3, gl.FLOAT, false, 20, nil)
纹理坐标属性:VertexAttribPointer(att3, 2, gl.FLOAT, false, 24, nil)


att是属性在着色器中的位置。

最新更新