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

VBO状态调用的结构

VBO状态调用的结构

Go
扬帆大鱼 2021-05-13 18:19:36
我正在将我的OpenGL 2程序转换为OpenGL 3,一次只有一个小步骤。当前的步骤是摆脱即时模式,转而使用VBO。我对所有VBO状态管理调用的正确位置感到困惑。假设我要有一堆对象,每个对象都有用于顶点和元素数据的自己的VBO。每个对象都有一个加载函数,用于设置其VBO并将数据加载到其中。它具有绑定其VBO并发出适当的draw命令的draw函数。为了防止对象相互干扰,我的主循环应该在调用PushClientAttrib(CLIENT_VERTEX_ARRAY_BIT)draw或load之前调用,对吗?(当然还有PopClientAttrib()。)当我推送/弹出该状态以保护我的加载功能时,不会绘制该对象。似乎需要在我的绘图函数中设置一些状态,但是我无法弄清楚它可能是什么。这是将新对象添加e到场景中的代码,让它调用其加载功能:    gl.PushClientAttrib(gl.CLIENT_VERTEX_ARRAY_BIT)    e.SceneAdded()    gl.PopClientAttrib()这就是我调用每个对象的draw函数的方式:    gl.PushClientAttrib(gl.CLIENT_VERTEX_ARRAY_BIT)    gl.PushMatrix()    p.Paint()    gl.PopMatrix()    gl.PopClientAttrib()这是对象的加载函数:    // Make the vertex & texture data known to GL.    gl.GenBuffers(1, &vboId)    gl.BindBuffer(gl.ARRAY_BUFFER, vboId)    gl.BufferData(gl.ARRAY_BUFFER,        gl.Sizeiptr(unsafe.Sizeof(gldata[0])*uintptr(len(gldata))),        gl.Pointer(&gldata[0].x), gl.STATIC_DRAW)    gl.VertexPointer(3, gl.DOUBLE, gl.Sizei(unsafe.Sizeof(gldata[0])),        gl.Pointer(unsafe.Offsetof(gldata[0].x)))    gl.TexCoordPointer(2, gl.DOUBLE, gl.Sizei(unsafe.Sizeof(gldata[0])),        gl.Pointer(unsafe.Offsetof(gldata[0].s)))    // Make the index data known to GL.    gl.GenBuffers(1, &iboId)    gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, iboId)    gl.BufferData(gl.ELEMENT_ARRAY_BUFFER,        gl.Sizeiptr(unsafe.Sizeof(sd.indices[0])*uintptr(len(sd.indices))),        gl.Pointer(&sd.indices[0]), gl.STATIC_DRAW)最后,这是对象的绘制函数:func draw() {    gl.BindBuffer(gl.ARRAY_BUFFER, vboId)    gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, iboId)    gl.EnableClientState(gl.VERTEX_ARRAY)    gl.EnableClientState(gl.TEXTURE_COORD_ARRAY)    gl.DrawElements(gl.TRIANGLES, indexcount, gl.UNSIGNED_SHORT, nil)}只是要清楚一点,如果我将两个EnableClientState调用从draw移到load,并且如果我不使用来保护load PushClientState,那么一切都会正常进行。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

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