关于kotlin中glBufferData()的GL_INVALID_OPERATION

时间:2017-09-22 09:14:40

标签: opengl kotlin lwjgl

我目前正通过LWJGL(用于学习Kotlin)在Kotlin中使用OpenGL创建游戏。我创建了一个代表VBO的类,如下所示:

package de.pascal_riesinger.Testing.gfx

import de.pascal_riesinger.Testing.Log
import de.pascal_riesinger.Testing.LogLevel
import de.pascal_riesinger.Testing.logGLError
import org.lwjgl.opengl.GL15
import java.nio.FloatBuffer

class VBO() {

    private var id: Int = 0

    init {
        Log(LogLevel.DEBUG, "VBO", "Allocating new VBO")
        id = GL15.glGenBuffers()
        Log(LogLevel.DEBUG, "VBO", "Allocated VBO with id $id")
    }

    fun bufferData(data: FloatBuffer, usage: Int) {
        bind()
        GL15.glBufferData(id, data, usage)
        unbind()
    }

    fun bind() {
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, id)
    }

    fun unbind() {
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0)
    }

}

是的,我知道这段代码不是很漂亮,但我对Kotlin的概念还是很陌生。 现在,当我运行以下代码段时:

  var vbo = VBO()
  var vertexBuffer = BufferUtils.createFloatBuffer(6)
  vertexBuffer.put(vertices)
  vertexBuffer.flip()

  //vbo.bind()
  vbo.bufferData(vertexBuffer, GL15.GL_STATIC_DRAW)

我会在调用GL_INVALID_OPERATION后得到一个OpenGL错误1282,即glBufferData()

我用Google搜索了错误,根据OpenGL规范,GL_INVALID_OPERATION仅在以下两种情况下被glBufferData()抛出:

  

如果零绑定到目标,则BufferData会生成INVALID_OPERATION错误。

     

如果缓冲区对象的BUFFER_IMMUTABLE_STORAGE标志为TRUE,则会生成INVALID_OPERATION错误。

后一个不能,因为我的缓冲区不是不可变的,我验证了生成的缓冲区ID不是零(似乎总是一个)。

请注意,取消注释vbo.bind()行并不能解决此问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

GL15.glBufferData的第一个参数必须是目标(在您的情况下为GL15.GL_ARRAY_BUFFER),而不是缓冲区的句柄。