VBO и IBO

Версия Minecraft
0.1+
1,111
47
420
Итак вот мой код:
Scala:
package ru.justagod.objblock.client.render.model

import org.lwjgl.BufferUtils
import org.lwjgl.opengl.GL15.{GL_ELEMENT_ARRAY_BUFFER, glDeleteBuffers, glGenBuffers}
import org.lwjgl.opengl.GL20.{glEnableVertexAttribArray, glVertexAttribPointer}
import org.lwjgl.opengl.{GL11, GL15, GL20}
import ru.justagod.objblock.client.helper.OGLHelper
import ru.justagod.objblock.client.helper.OGLHelper._
import ru.justagod.objblock.client.render.shader.{DefaultShader, SkeletonShader}

/**
  * Created by JustAGod on 01.02.2018.
  */
class FastModel(private val vertices: Array[Vertex], private val faces: Array[Face]) {


    @inline private val stride = 12

    // Indices
    private val ibo = glGenBuffers()

    // Attributes
    private val vao = glGenBuffers()

    private var _dead = false


    updateBuffers()

    private def updateBuffers(): Unit = {
        makeIndices()
        makeVao()
    }


   

    private def makeVao(): Unit = {
        val buffer = BufferUtils.createFloatBuffer(vertices.length * stride / 4)
        vertices.foreach({
            vertex =>
                buffer
                    .put(vertex.x.toFloat)
                    .put(vertex.y.toFloat)
                    .put(vertex.z.toFloat)
        })
        addBufferData(vao, buffer)
    }

    private def makeIndices(): Unit = {
        val index = BufferUtils.createIntBuffer(faces.length * 3)
        for (elem <- faces) {
            index.put(elem.v1).put(elem.v2).put(elem.v3)
        }
        addBufferData(ibo, index, GL_ELEMENT_ARRAY_BUFFER, GL15.GL_STATIC_DRAW)
    }


    def render(): Unit = {
        if (dead) throw new RuntimeException("I'm dead")

        GL11.glDisable(GL11.GL_CULL_FACE)
        GL11.glColor4d(1, 1, 1, 1)

        GL11.glDisable(GL11.GL_TEXTURE_2D)
        bindBuffer(vao)
        GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY)
        GL11.glVertexPointer(3, GL11.GL_FLOAT, stride, 0)

        //GL11.glEnableClientState(GL11.GL_COLOR_ARRAY)
        //GL11.glColorPointer(4, GL11.GL_FLOAT, stride, 12)

        bindBuffer(ibo, GL_ELEMENT_ARRAY_BUFFER)
        GL11.glDrawElements(GL11.GL_TRIANGLES, faces.length * 3, GL11.GL_UNSIGNED_INT, 0)
        GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY)
        //GL11.glDisableClientState(GL11.GL_COLOR_ARRAY)
        unbindBuffer()
        unbindBuffer(GL_ELEMENT_ARRAY_BUFFER)
        GL11.glEnable(GL11.GL_CULL_FACE)
    }

    def destroy(): Unit = {
        if (dead) throw new RuntimeException("I'm already dead")
        glDeleteBuffers(ibo)
        glDeleteBuffers(vao)
        _dead = true
    }

    def dead: Boolean = _dead


}

Тут я пытаюсь нарисовать модель через vbo и клиент стэйт, используя индексы. Вершин 8. Каждая соответствует вершине куба. Индексы проверил сто раз там все верно. Их ровно 36 и все бы должно быть ок. На закоменченные строки просба не ругаться, ибо это результат моих дум. Собственно проблема в том что крашиться где то в нативке. Помогите, будте так добры.
Краш-лог
 
Последнее редактирование:
1,111
47
420
Ну смотри
Scala:
def addBufferData(buffer: Int, data: Buffer, target: Int = GL15.GL_ARRAY_BUFFER, `type`: Int = GL15.GL_STATIC_DRAW): Unit = {
        data.flip()
        bindBuffer(buffer, target)
        data match {
            case f: FloatBuffer => GL15.glBufferData(target, f, `type`)
            case b: ByteBuffer => GL15.glBufferData(target, b, `type`)
            case s: ShortBuffer => GL15.glBufferData(target, s, `type`)
            case i: IntBuffer => GL15.glBufferData(target, i, `type`)
            case d: DoubleBuffer => GL15.glBufferData(target, d, `type`)
        }
        unbindBuffer(target)
    }
 
Сверху