GLSL開始

ousttrue2008-02-15

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()