vertxattribpointer中的不安全指针

时间:2017-03-17 17:06:00

标签: opengl go

我一直在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))

1 个答案:

答案 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是着色器中属性的位置。