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