Skip to content

Instantly share code, notes, and snippets.

@alimuldal
Created June 3, 2014 18:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alimuldal/77b47f58109e6d2de35d to your computer and use it in GitHub Desktop.
Save alimuldal/77b47f58109e6d2de35d to your computer and use it in GitHub Desktop.
from OpenGL import GL as gl
from OpenGL import GLUT as glut
from OpenGL.arrays import vbo
import numpy as np
from scipy.misc import lena
class TextureQuad2D(object):
def __init__(self, texdata, rect=(-1., -1., 1., 1.)):
# build the texture
self.texture = gl.glGenTextures(1)
gl.glBindTexture(gl.GL_TEXTURE_2D, self.texture)
gl.glTexEnvf(gl.GL_TEXTURE_ENV,
gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE)
gl.glTexParameterf(gl.GL_TEXTURE_2D,
gl.GL_TEXTURE_WRAP_S, gl.GL_REPEAT)
gl.glTexParameterf(gl.GL_TEXTURE_2D,
gl.GL_TEXTURE_WRAP_T, gl.GL_REPEAT)
gl.glTexParameterf(gl.GL_TEXTURE_2D,
gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
gl.glTexParameterf(gl.GL_TEXTURE_2D,
gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST)
w, h = texdata.shape
gl.glTexImage2D(
gl.GL_TEXTURE_2D, 0, gl.GL_LUMINANCE, w, h, 0, gl.GL_LUMINANCE,
gl.GL_FLOAT, texdata
)
# display list
# --------------------------------------------------------------
texlist = gl.glGenLists(1)
gl.glNewList(texlist, gl.GL_COMPILE)
gl.glBindTexture(gl.GL_TEXTURE_2D, self.texture)
gl.glEnable(gl.GL_TEXTURE_2D)
x0, y0, x1, y1 = rect
gl.glBegin(gl.GL_QUADS)
gl.glTexCoord2f(0, 1)
gl.glVertex2f(x0, y1)
gl.glTexCoord2f(0, 0)
gl.glVertex2f(x0, y0)
gl.glTexCoord2f(1, 0)
gl.glVertex2f(x1, y0)
gl.glTexCoord2f(1, 1)
gl.glVertex2f(x1, y1)
gl.glEnd()
gl.glDisable(gl.GL_TEXTURE_2D)
gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
gl.glEndList()
# --------------------------------------------------------------
self.texlist = texlist
pass
def draw(self):
gl.glCallList(self.texlist)
if __name__ == '__main__':
glut.glutInit()
glut.glutInitDisplayMode( glut.GLUT_DOUBLE | glut.GLUT_RGB )
glut.glutInitWindowSize( 500, 250 )
glut.glutInitWindowPosition( 100, 100 )
glut.glutCreateWindow( None )
img = np.flipud(lena().astype(np.float32))
img = (img - img.min()) / img.ptp()
checker = np.zeros((6, 6), dtype=np.float32)
checker[::2, ::2] = 1
checker[1::2, 1::2] = 1
background1 = TextureQuad2D(img, rect=(-1, -1, 0, 1))
overlay1 = TextureQuad2D(checker, rect=(-1, -1, 0, 1))
background2 = TextureQuad2D(img, rect=(0, -1, 1, 1))
overlay2 = TextureQuad2D(checker, rect=(0, -1, 1, 1))
def draw_scene():
# set the viewport and projection
gl.glViewport(0,0,500,250)
gl.glMatrixMode(gl.GL_PROJECTION)
gl.glLoadIdentity()
gl.glOrtho(-1,1,-1,1,0,1)
gl.glMatrixMode(gl.GL_MODELVIEW)
gl.glClearColor(0,0,0,0)
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
gl.glEnable(gl.GL_BLEND)
glBendFuncSeparate(GL_SRC_ALPHA,GL_ONE,GL_ZERO,GL_ONE)
# additive
gl.glBlendEquation(gl.GL_FUNC_ADD)
gl.glColor(1, 1, 1, 1)
background1.draw()
gl.glColor(1, 1, 1, 0.5) # this looks OK
overlay1.draw()
# subtractive
gl.glBlendEquation(gl.GL_FUNC_ADD)
gl.glColor(1, 1, 1, 1)
background2.draw()
gl.glBlendEquation(gl.GL_FUNC_REVERSE_SUBTRACT)
gl.glColor(1, 1, 1, 0.5) # negative alpha values clearly won't work!
overlay2.draw()
gl.glDisable(gl.GL_BLEND)
glut.glutSwapBuffers()
glut.glutDisplayFunc( draw_scene )
glut.glutIdleFunc( draw_scene )
glut.glutMainLoop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment