import ctypes import OpenGL.GL as gl from sdl2 import * #everything has a SDL_ prefix. ick! import numpy as np W,H=640,480 FPS=60 frame_minticks=1000/60 # === SDL/OpenGL init === SDL_Init(SDL_INIT_VIDEO) SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24); window=SDL_CreateWindow("OpenGL test",100,100,W,H,SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN) context=SDL_GL_CreateContext(window) SDL_GL_SetSwapInterval(0) gl.glClearColor(1.0,1.0,1.0,1.0) gl.glClear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT) SDL_GL_SwapWindow(window) # === shader compilation === shader_program=gl.glCreateProgram() shader_vertex=gl.glCreateShader(gl.GL_VERTEX_SHADER) shader_fragment=gl.glCreateShader(gl.GL_FRAGMENT_SHADER) gl.glShaderSource(shader_vertex, """ #version 330 attribute vec3 position; attribute vec4 color; varying vec4 v_color; void main() { gl_Position=vec4(position,1.0); v_color=color; } """) gl.glShaderSource(shader_fragment, """ #version 330 varying vec4 v_color; void main() { gl_FragColor=v_color; } """) gl.glCompileShader(shader_vertex) print "=== vertex shader log ===" if gl.glGetShaderiv(shader_vertex,gl.GL_COMPILE_STATUS): print "OK" else: log=gl.glGetShaderInfoLog(shader_vertex) print log gl.glCompileShader(shader_fragment) print "=== fragment shader log ===" if gl.glGetShaderiv(shader_fragment,gl.GL_COMPILE_STATUS): print "OK" else: log=gl.glGetShaderInfoLog(shader_fragment) print log print "=== end shader logs ===" gl.glAttachShader(shader_program,shader_vertex) gl.glAttachShader(shader_program,shader_fragment) gl.glLinkProgram(shader_program) gl.glUseProgram(shader_program) # === buffer creation === vertex_data=np.zeros(4,dtype=[("position",np.float32,3),("color",np.float32,4)]) vertex_data[1]=((-1,-1,1),(1,0,0,1)) vertex_data[0]=(( 1,-1,1),(0,1,0,1)) vertex_data[2]=(( 1, 1,1),(0,0,1,1)) vertex_data[3]=((-1, 1,1),(1,1,0,1)) vertex_buffer=gl.glGenBuffers(1) gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer) gl.glBufferData(gl.GL_ARRAY_BUFFER,vertex_data.nbytes,vertex_data,gl.GL_DYNAMIC_DRAW) # === buffer binding === stride=vertex_data.strides[0] offset=ctypes.c_void_p(0) loc=gl.glGetAttribLocation(shader_program,"position") gl.glEnableVertexAttribArray(loc) gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer) gl.glVertexAttribPointer(loc,3,gl.GL_FLOAT,False,stride,offset) offset=ctypes.c_void_p(vertex_data.dtype["position"].itemsize) loc=gl.glGetAttribLocation(shader_program,"color") gl.glEnableVertexAttribArray(loc) gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer) gl.glVertexAttribPointer(loc,4,gl.GL_FLOAT,False,stride,offset) # === main loop === event=SDL_Event() while True: frame_startticks=SDL_GetTicks() while SDL_PollEvent(ctypes.byref(event))!=0: if event.type==SDL_QUIT: SDL_DestroyWindow(window) SDL_Quit() raise SystemExit("clean exit") gl.glClear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT) gl.glDrawArrays(gl.GL_TRIANGLE_STRIP, 0, 4) SDL_GL_SwapWindow(window) frame_endticks=SDL_GetTicks() frame_spentticks=frame_endticks-frame_startticks if(frame_spentticks