我一直在golang学习一些opengl并且有以下片段:
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位参数中为位置似乎有效,但是在较大的程序中我没有得到任何颜色。如果我尝试为poistion指定0的偏移不安全指针,我只会得到空的空间。
指定一个不安全的指针有一些我现在不理解的东西 - 我想我需要在顶点指定颜色偏移的位置,但是我没有跟随。我也不确定vlen是否正确。任何意见都赞赏。
编辑:
自我找到解决方案 - 我需要的是gl.PtrOffset,我在最初创建队列时并不知道。
gl.VertexAttribPointer(1, 3, gl.FLOAT, false, vlen, gl.PtrOffset(offset))
答案 0 :(得分:0)
您的问题来自VertexAttribPointer(att, size, type, normalized, stride, pointer)
size 是每个通用顶点属性的组件数。位置和颜色有3个组件,纹理坐标只有2个。
stride 是要在着色器中读取的属性的两个连续值之间的字节偏移量。
您的缓冲区是PPPCCCTT,PPPCCCTT等(即位置,颜色,纹理坐标,位置,颜色,纹理坐标等)。让它以字节为单位(" float"是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
是着色器中属性的位置。