在kotlin的glBufferData()上使用GL_INVALID_OPERATION

我目前正在通过LWJGL(用于学习Kotlin)用OpenGL在Kotlin上创建一个游戏。 我创建了一个代表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) 

在调用glBufferData()之后,我将得到一个OpenGL错误1282,它是GL_INVALID_OPERATION

我GOOGLE了错误,并按照OpenGL规范GL_INVALID_OPERATION是由glBufferData()抛出只在以下两种情况:

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

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

后者不可能是这种情况,因为我的缓冲区不是不可变的,我证实了缓冲区的生成ID不是零(它似乎总是一个)。

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

谢谢你的帮助!

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