-
- 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
- layout(location=0) in vec3 position;
- layout(location=1) in vec4 color;
- out vec4 v_color;
- void main()
- {
- gl_Position=vec4(position,1.0);
- v_color=color;
- }
- """)
- gl.glShaderSource(shader_fragment, """
- #version 330
- in vec4 v_color;
- out vec4 f_color;
- void main()
- {
- f_color=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<frame_minticks):
- SDL_Delay(frame_minticks-frame_spentticks)
-