from OpenGL.GL import *
from OpenGL.GLUT import *
def _make_shader(stype, src):
shader = glCreateShader(stype)
glShaderSource(shader, src)
glCompileShader(shader)
if not glGetShaderiv(shader, GL_COMPILE_STATUS):
err = glGetShaderInfoLog(shader)
glDeleteShader(shader)
raise Exception(err)
return shader
verts = (GLfloat*8)()
for i, v in enumerate([-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0]):
verts[i] = v
polys = (GLushort*6)()
for i, v in enumerate([0,1,3,1,2,3]):
polys[i] = v
def init_gl():
global program, posidx, vbuf, ebuf
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glClearColor(0.5,0.5,0.5,1)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glEnable(GL_TEXTURE_2D)
glViewport(0,0,800,600)
######################################
# Make the shaders and programs
######################################
vshade = _make_shader(GL_VERTEX_SHADER, open("stupid.v.glsl").read())
fshade = _make_shader(GL_FRAGMENT_SHADER, open("stupid.f.glsl").read())
program = glCreateProgram()
glAttachShader(program, vshade)
glAttachShader(program, fshade)
glLinkProgram(program)
#######################################
# Fetch positions, push poly to card
#######################################
posidx = glGetAttribLocation(program, "position")
vbuf = glGenBuffers(1)
ebuf = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbuf)
glBufferData(GL_ARRAY_BUFFER, verts, GL_STATIC_DRAW)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebuf)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, polys, GL_STATIC_DRAW)
#####################################
# Enter main drawing loop!
#####################################
def render():
global program, posidx, vbuf, ebuf
# Clear the screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glUseProgram(program)
# Enable the position attribute
glEnableVertexAttribArray(posidx)
glBindBuffer(GL_ARRAY_BUFFER, vbuf)
glVertexAttribPointer( posidx, 2, GL_FLOAT, GL_FALSE, 4*2, 0)
# Draw the two triangles
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebuf);
glDrawElements(
GL_TRIANGLES, # mode
6, # count
GL_UNSIGNED_SHORT, # type
0 # element array buffer offset
)
glDisableVertexAttribArray(posidx)
glutSwapBuffers()
def main():
glutInit()
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowSize(800, 600);
glutCreateWindow("Flag");
glutDisplayFunc(render);
init_gl();
glutMainLoop();
if __name__ == "__main__":
main()