猿问

Golang OpenGL元素缓冲区对象无法正确呈现

我正在尝试使用元素缓冲区对象使用针对OpenGL的go-gl绑定在Golang中呈现一个简单的矩形。以下是主要代码:


package main


import (

    "gogame/shaders"

    "runtime"


    "github.com/go-gl/gl/v4.1-core/gl"

    "github.com/go-gl/glfw/v3.2/glfw"


    log "github.com/sirupsen/logrus"

)


var vertices = []float32{

    -0.5, -0.5, 0.0,

    -0.5, 0.5, 0.0,

    0.5, 0.5, 0.0,

    0.5, -0.5, 0.0,

}


var rectangle = []uint{

    0, 1, 2,

    2, 3, 0,

}


func init() {

    runtime.LockOSThread()

}


func main() {

    window := initGLFW()

    defer glfw.Terminate()


    program := initOpenGL()


    var vertexBuffer uint32

    var elementBuffer uint32

    var vertexArray uint32


    gl.GenBuffers(1, &vertexBuffer)

    gl.GenBuffers(1, &elementBuffer)

    gl.GenVertexArrays(1, &vertexArray)


    gl.BindVertexArray(vertexArray)


    gl.BindBuffer(gl.ARRAY_BUFFER, vertexBuffer)

    gl.BufferData(gl.ARRAY_BUFFER, 4*len(vertices), gl.Ptr(vertices), gl.STATIC_DRAW)


    gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer)

    gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, 4*len(rectangle), gl.Ptr(rectangle), gl.STATIC_DRAW)


    gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil)

    gl.EnableVertexAttribArray(0)


    gl.BindBuffer(gl.ARRAY_BUFFER, 0)

    gl.BindVertexArray(0)


    if err := gl.GetError(); err != 0 {

        log.Error(err)

    }


    for !window.ShouldClose() {

        gl.ClearColor(0.5, 0.5, 0.5, 0.5)

        gl.Clear(gl.COLOR_BUFFER_BIT)

        gl.Clear(gl.DEPTH_BUFFER_BIT)

        gl.UseProgram(program)


        gl.BindVertexArray(vertexArray)

        gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, gl.PtrOffset(0))

        //gl.DrawArrays(gl.TRIANGLES, 0, 3)


        glfw.PollEvents()

        window.SwapBuffers()


        if err := gl.GetError(); err != 0 {

            log.Error(err)

        }

    }


    glfw.Terminate()

}

从理论上讲,这应该绘制一个矩形。但是,这是在线框模式下运行时得到的结果:

OpenGL视窗

我遗漏的代码只是用来编译非常基本的着色器并初始化GLFW和OpenGL。


呼如林
浏览 277回答 1
1回答

撒科打诨

您可能正在使用64位操作系统。在64位操作系统上,数据类型uint的大小为64位。请参阅“ Go语言”数据类型或“ GO基本类型”。指定的矩形ar的坐标是这样的: 1: -0.5, 0.5             2: 0.5, 0.5             x-----------x             |           |             |           |             |           |             |           |             x-----------x0: -0.5, -0.5             3: 0.5, -0.5indexs数组是64位整数值的数组:var rectangle = []uint{    0, 1, 2,    2, 3, 0,}但是,当几何图形为draw(gl.UNSIGNED_INT)时,它将被视为32位整数的数组:gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, gl.PtrOffset(0))这导致数组的每个索引被拆分为2个索引,每个索引32位,其中第一个值为数组的索引,第二个为0:[0, 0,   1, 0,   2, 0,   2, 0,   3, 0   0, 0]因此,前2个三角形(前6个索引)是0 - 0 - 10 - 2 - 0在图像中,您可以看到这2个三角形,它们被缩小为2条线,因为每个三角形的2个点是相等的。使用数据类型uint32解决问题:var rectangle = []uint32{    0, 1, 2,    2, 3, 0,}
随时随地看视频慕课网APP

相关分类

Go
我要回答