Skip to content

Instantly share code, notes, and snippets.

@varadgautam
Last active August 10, 2016 17:39
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 varadgautam/9e3b70fb7099002e361159ef2dc24678 to your computer and use it in GitHub Desktop.
Save varadgautam/9e3b70fb7099002e361159ef2dc24678 to your computer and use it in GitHub Desktop.
render to an ms fbo and blit
# render to an ms fbo and blit
from ctypes import *
import sys
gl = cdll.LoadLibrary('libGL.so')
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
glCreateShader = gl.glCreateShader
glShaderSource = gl.glShaderSource
glShaderSource.argtypes = [c_int, c_int, POINTER(c_char_p), POINTER(c_int)]
glCompileShader = gl.glCompileShader
glGetShaderiv = gl.glGetShaderiv
glGetShaderiv.argtypes = [c_int, c_int, POINTER(c_int)]
glGetShaderInfoLog = gl.glGetShaderInfoLog
glGetShaderInfoLog.argtypes = [c_int, c_int, POINTER(c_int), c_char_p]
glDeleteShader = gl.glDeleteShader
glCreateProgram = gl.glCreateProgram
glAttachShader = gl.glAttachShader
glLinkProgram = gl.glLinkProgram
glGetError = gl.glGetError
glUseProgram = gl.glUseProgram
GL_FRAGMENT_SHADER = 0x8B30
GL_VERTEX_SHADER = 0x8B31
GL_COMPILE_STATUS = 0x8B81
GL_LINK_STATUS = 0x8B82
GL_INFO_LOG_LENGTH = 0x8B84
def compile_shader(source, shader_type):
shader = glCreateShader(shader_type)
source = c_char_p(source)
length = c_int(-1)
glShaderSource(shader, 1, byref(source), byref(length))
glCompileShader(shader)
status = c_int()
glGetShaderiv(shader, GL_COMPILE_STATUS, byref(status))
if not status.value:
print_log(shader)
glDeleteShader(shader)
raise ValueError, 'Shader compilation failed'
return shader
def compile_program(vertex_source, fragment_source):
vertex_shader = None
fragment_shader = None
program = glCreateProgram()
if vertex_source:
vertex_shader = compile_shader(vertex_source, GL_VERTEX_SHADER)
glAttachShader(program, vertex_shader)
if fragment_source:
fragment_shader = compile_shader(fragment_source, GL_FRAGMENT_SHADER)
glAttachShader(program, fragment_shader)
glLinkProgram(program)
if vertex_shader:
glDeleteShader(vertex_shader)
if fragment_shader:
glDeleteShader(fragment_shader)
return program
def print_log(shader):
length = c_int()
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, byref(length))
if length.value > 0:
log = create_string_buffer(length.value)
glGetShaderInfoLog(shader, length, byref(length), log)
print >> sys.stderr, log.value
width, height = 400, 200
def show():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
program = compile_program('''
attribute vec4 aPostion;
void main() {
gl_Position = aPostion;
}
''', '''
void main() {
gl_FragColor.rb = gl_FragCoord.xy / vec2(400.0, 200.0);
gl_FragColor.ga = vec2(0.0, 1.0);
}
''')
vertices = [
#-0.5, -0.75, 0.0,
-0.75, 0.0, 0.0,
0, -0.75, 0.0,
0.5, 0.5, 0.0 ]
vertices2 = [
-1, -1, 0.0,
1, -1, 0.0,
-1, 1, 0.0,
1, 1, 0.0 ]
glViewport(0, 0, width, height)
glUseProgram(program)
fbo = glGenFramebuffers(1)
fbotex = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, fbotex)
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, GL_RGBA, width, height, 1)
glBindFramebuffer(GL_FRAMEBUFFER, fbo)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, fbotex, 0)
glViewport(0, 0, width, height)
glClearColor(0.3125, 0.3125, 0.3125, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices)
glEnableVertexAttribArray(0)
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3)
glBindFramebuffer(GL_FRAMEBUFFER, 0)
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo)
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST)
glutSwapBuffers()
if __name__ == '__main__':
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE)
glutInitWindowSize(width, height)
glutCreateWindow('MSAA_GL')
glutDisplayFunc(show)
glutMainLoop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment