Last active
August 10, 2016 17:39
-
-
Save varadgautam/9e3b70fb7099002e361159ef2dc24678 to your computer and use it in GitHub Desktop.
render to an ms fbo and blit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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