为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
呼如林 2021-04-04 20:17:36
我正在尝试使用元素缓冲区对象使用针对OpenGL的go-gl绑定在Golang中呈现一个简单的矩形。以下是主要代码:package mainimport (    "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。
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

您可能正在使用64位操作系统。在64位操作系统上,数据类型uint的大小为64位。请参阅“ Go语言”数据类型或“ GO基本类型”。


指定的矩形ar的坐标是这样的:


 1: -0.5, 0.5             2: 0.5, 0.5

             x-----------x

             |           |

             |           |

             |           |

             |           |

             x-----------x

0: -0.5, -0.5             3: 0.5, -0.5

indexs数组是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 - 1

0 - 2 - 0

在图像中,您可以看到这2个三角形,它们被缩小为2条线,因为每个三角形的2个点是相等的。


使用数据类型uint32解决问题:


var rectangle = []uint32{

    0, 1, 2,

    2, 3, 0,

}


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 275 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信