亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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視窗我遺漏的代碼只是用來編譯非?;镜闹鞑⒊跏蓟疓LFW和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 關注
  • 298 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號