GLSL開始
glewpyのサンプルから
vertexShaderとfragmentShaderのソースだけを変更して試すベースを作成。
これからGLSLの中身に入る。
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from glew import * # global r=0 #ティーポットの回転角度 def display(): """ Y軸でティーポットを回転 """ global r glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 7, 0, 0, 0, 0, 1, 0) glRotate(r, 0, 1, 0); glutSolidTeapot(1.0) glutSwapBuffers() r+=1 def reshape(w, h): glViewport(0, 0, w, h) if h: glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(60.0, float(w) / float(h), 1.0, 100.0) def idle(): glutPostRedisplay() def initGL(): # glew err = glewInit() if (err != GLEW_OK): print 'Error loading glew:', glewGetErrorString(err) sys.exit() else: print 'GLEW Version:', glewGetString(GLEW_VERSION) print 'Checking for GLSL Support' extensions = ["GL_ARB_fragment_shader", "GL_ARB_vertex_shader", "GL_ARB_shader_objects", "GL_ARB_shading_language_100"] for ext in extensions: sys.stdout.write('-- %s ' % ext) if (glewGetExtension(ext) != GL_TRUE): print '.' * (40 - len(ext)), '[!!]' print "Driver does not support OpenGL Shading Language" sys.exit() else: print '.' * (40 - len(ext)), '[OK]' # opengl glClearColor(0.2, 0.2, 0.5, 1.0) glEnable(GL_DEPTH_TEST) def initShader(vertex_shader_source, fragment_shader_source): # create program shaderProgram=glCreateProgramObjectARB() print 'create program' printOpenGLError() # vertex shader print 'vertex shader' vertShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB) glShaderSourceARB(vertShader, 1, [vertex_shader_source]) glCompileShaderARB(vertShader) glAttachObjectARB(shaderProgram, vertShader) printOpenGLError() # fragment shader print 'fragment shader' fragShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB) glShaderSourceARB(fragShader, 1, [fragment_shader_source]) glCompileShaderARB(fragShader) glAttachObjectARB(shaderProgram, fragShader) printOpenGLError() print 'link...use...' glLinkProgramARB(shaderProgram) printOpenGLError() if glUseProgramObjectARB(shaderProgram): printOpenGLError() # Checks for GL posted errors after appropriate calls def printOpenGLError(): err = glGetError() if (err != GL_NO_ERROR): print 'GLERROR: ', gluErrorString(err) sys.exit() if (__name__ == '__main__'): # glut glutInit(sys.argv) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH) glutInitWindowSize(600, 400) glutCreateWindow("GLEW Testing") # glewとopenGLの初期化 initGL() # vertex shaderとfragment shaderの初期化 initShader( # 頂点シェーダ """ void main(){ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } """, # フラグメントシェーダ """ void main(){ gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0); } """) # glut callback glutDisplayFunc(display) glutReshapeFunc(reshape) glutIdleFunc(idle) glutMainLoop()