Problems with BGL + Vertex Buffer Objects

I’m trying to draw a simple quad (2 triangles) using VBOs with BGL, but when I press P, Blender simply crashes and gives me Error: EXCEPTION_ACCESS_VIOLATION.
I’m just using 1 VBO for the vertex positions and 1 VBO for the UVs, and a simple shader.

VBO creation


    def glGenBuffer():
        id_buf = Buffer(GL_INT, 1)
        glGenBuffers(1, id_buf)
        return id_buf.to_list()[0]
...
        verts = [
            0, 0, 0,
            0, 1, 0,
            1, 0, 0,
            1, 1, 0,
            1, 0, 0,
            0, 1, 0
        ]


        vertBuff = Buffer(GL_FLOAT, len(verts), verts)


        GFX._vbo = glGenBuffer()
        glBindBuffer(GL_ARRAY_BUFFER, GFX._vbo)
        glBufferData(GL_ARRAY_BUFFER, len(verts) * 4, vertBuff, GL_STATIC_DRAW)


        GFX._uv = glGenBuffer()
        GFX.setUV(0, 0, 1, 1)


        vsID = glCreateShader(GL_VERTEX_SHADER)
        fsID = glCreateShader(GL_FRAGMENT_SHADER)


        vsCode = """
            #version 120
            attribute vec3 pos;
            attribute vec2 uv;
            varying vec2 out_uv;
            void main() {
                gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0);
                out_uv = uv;
            }
        """
        fsCode = """
            #version 120
            uniform vec4 color;
            uniform sampler2D image;
            uniform int hasImage;
            varying vec2 out_uv;
            void main() {
                if (hasImage == 1) {
                    gl_FragColor = texture2D(image, out_uv) * color;
                } else {
                    gl_FragColor = color;
                }
            }
        """


        glShaderSource(vsID, vsCode)
        glCompileShader(vsID)


        glShaderSource(fsID, fsCode)
        glCompileShader(fsID)


        GFX._program = glCreateProgram()
        glAttachShader(GFX._program, vsID)
        glAttachShader(GFX._program, fsID)
        glLinkProgram(GFX._program)


        glDeleteShader(vsID)
        glDeleteShader(fsID)


    @staticmethod
    def setUV(uvx1, uvy1, uvx2, uvy2):
        uvs = [
            uvx1, uvy1,
            uvx1, uvy2,
            uvx2, uvy1,
            uvx2, uvy2,
            uvx2, uvy1,
            uvx1, uvy2
        ]
        uvBuff = Buffer(GL_FLOAT, len(uvs), uvs)


        glBindBuffer(GL_ARRAY_BUFFER, GFX._uv)
        glBufferData(GL_ARRAY_BUFFER, len(uvs) * 4, uvBuff, GL_STATIC_DRAW)

Test


from bge import logic as g
import compz


compz.GFX.init()


def draw():
    compz.GFX.drawQuad(0, 0, 10, 10)


sce = g.getCurrentScene()
sce.post_draw = [draw]

PS: The problem occurs on VBO creation only. If I comment that block out the problem is gone but, well, I’m left with no quads…

Thanks in advance :slight_smile:

Nevermind, forgot to unbind the VBO and the shader program… :no:

LOL! Just remember that you have to do it with basicly anything:D