2017-09-22 38 views
1

我目前正在通過LWJGL(用於學習Kotlin)在OpenGL中通過Kotlin創建一個遊戲。我創建了代表VBO,它看起來像這樣一類:GL_INVALID_OPERATION在glBufferData()kotlin

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) 
    } 

} 

是的,我知道這個代碼是不是漂亮,但我仍然很新的科特林的概念。 現在,當我運行下面的代碼片段:

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

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

我會得到一個OpenGL錯誤1282,它調用glBufferData()之後是GL_INVALID_OPERATION

我GOOGLE的誤差和每OpenGL規範,GL_INVALID_OPERATION通過glBufferData()僅在以下兩種情況下拋出:由BufferData產生

一個INVALID_OPERATION錯誤,如果零被綁定到目標。

如果緩衝區對象的BUFFER_IMMUTABLE_STORAGE標誌爲TRUE,則會產生INVALID_OPERATION錯誤。

後者一個不能是的情況下,作爲我的緩衝並不是一成不變的,我驗證該緩衝器的生成的ID不爲零(它似乎永遠是一個)。

請注意,取消註釋vbo.bind()行不能解決此問題。

感謝您的幫助!

回答

2

GL15.glBufferData的第一個參數必須是目標(您的情況爲GL15.GL_ARRAY_BUFFER),而不是緩衝區的句柄。

+0

謝謝,我現在覺得很蠢:D –