Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from ctypes import *
- import sys
- import pygame
- from pygame.locals import *
- from OpenGL.GL import *
- from OpenGL.GLU import *
- from OpenGL.GLUT import *
- 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)
- if __name__ == '__main__':
- glutInit(sys.argv)
- width, height = 640, 480
- pygame.init()
- pygame.display.set_mode((width, height), OPENGL | DOUBLEBUF)
- program = compile_program('''
- // Vertex program
- varying vec3 pos;
- void main() {
- pos = gl_Vertex.xyz;
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- }
- ''', '''
- // Fragment program
- varying vec3 pos;
- void main() {
- gl_FragColor.rgb = pos.xyz;
- }
- ''')
- glMatrixMode(GL_PROJECTION)
- glLoadIdentity()
- gluPerspective(90.0, width / float(height), 1.0, 100.0)
- glMatrixMode(GL_MODELVIEW)
- glEnable(GL_DEPTH_TEST)
- quit = False
- angle = 0
- while not quit:
- for e in pygame.event.get():
- if e.type in (QUIT, KEYDOWN):
- quit = True
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
- glLoadIdentity()
- glTranslate(0.0, 0.0, -2.5)
- glRotate(angle, 0.0, 1.0, 0.0)
- glUseProgram(program)
- glutSolidTeapot(1.0)
- angle += 0.1
- pygame.display.flip()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement