Created
August 12, 2016 13:10
-
-
Save varadgautam/57265a996fc29ade60ef0dbaf16f1f90 to your computer and use it in GitHub Desktop.
test ms->ms and ms->non-ms blits
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
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, 240 | |
def show(): | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) | |
program = compile_program(''' | |
// Vertex program | |
attribute vec4 aPostion; | |
void main() { | |
gl_Position = aPostion; | |
} | |
''', ''' | |
// Fragment program | |
void main() { | |
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); | |
} | |
''') | |
vertices = [ | |
-0.735, -0.75, 0.0, | |
0.75, -0.75, 0.0, | |
-0.735, 0.75, 0.0, | |
0.75, 0.75, 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) | |
# draw to ms rbo | |
fbo = glGenFramebuffers(1) | |
fborbo = glGenRenderbuffers(1) | |
glBindRenderbuffer(GL_RENDERBUFFER, fborbo) | |
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, width, height) | |
glBindFramebuffer(GL_FRAMEBUFFER, fbo) | |
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, fborbo) | |
glViewport(0, 0, width, height) | |
glClearColor(0.3125, 0.3125, 0.3125, 0.3125); | |
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, 4) | |
# create new ms rbo and blit | |
fbo2 = glGenFramebuffers(1) | |
fborbo2 = glGenRenderbuffers(1) | |
glBindRenderbuffer(GL_RENDERBUFFER, fborbo2) | |
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, width, height) | |
glBindFramebuffer(GL_FRAMEBUFFER, fbo2) | |
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, fborbo2) | |
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo2) | |
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo) | |
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST) | |
# finally blit to window fb | |
glBindFramebuffer(GL_FRAMEBUFFER, 0) | |
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0) | |
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo2) | |
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('testing') | |
glutDisplayFunc(show) | |
glutMainLoop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment