Для быстрого тестирования шейдеров решил писать скрипты с использованием PyOpenGL. За основу брал туториал с сайта Pygame. Но теперь в PyOpenGL уже появились wrapper'ы для функций OpenGL 2.0. Вот простейший скрипт с ними:
import sys, pygame from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from pygame.locals import * if __name__ == "__main__": glutInit(sys.argv) width, height = (640, 480) pygame.init() pygame.display.set_mode((width, height), OPENGL | DOUBLEBUF) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(90.0, width/float(height), 1.0, 100.0) glMatrixMode(GL_MODELVIEW) glEnable(GL_DEPTH_TEST) v_sh = glCreateShader(GL_VERTEX_SHADER) f_sh = glCreateShader(GL_FRAGMENT_SHADER) glShaderSource(v_sh, ''' void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } ''') glCompileShader(v_sh) print glGetShaderInfoLog(v_sh) if not glGetShaderiv(v_sh, GL_COMPILE_STATUS): glDeleteShader(v_sh) sys.exit() glShaderSource(f_sh, ''' void main() { gl_FragColor = vec4(0.6, 0.1, 0.1, 1.0); } ''') glCompileShader(f_sh) print glGetShaderInfoLog(f_sh) if not glGetShaderiv(f_sh, GL_COMPILE_STATUS): glDeleteShader(f_sh) sys.exit() program = glCreateProgram() glAttachShader(program, v_sh) glAttachShader(program, f_sh) glLinkProgram(program) print glGetProgramInfoLog(program) 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, -3.5) glRotate(angle, 0.0, 1.0, 0.0) glRotate(angle, 0.0, 0.0, 1.0) glutSolidTeapot(1.0) angle += 0.1 pygame.display.flip()
форум плохо показывает отступы количество аргументов у функций правильное (wrap'ятся так). этот скрипт выдает следующее
Vertex shader was successfully compiled to run on hardware. Fragment shader was successfully compiled to run on hardware. Fragment shader(s) failed to link, vertex shader(s) failed to link. ERROR: 2:1: 'v' : syntax error parse error ERROR: compilation errors. No code generated. ERROR: 2:1: 'v' : syntax error parse error ERROR: compilation errors. No code generated.
любопытно, что сообщения об ошибках компиляции появляются после сообщения "shader was successfully compiled"
если убрать фрагментный шейдер, то просто
Vertex shader was successfully compiled to run on hardware. Fragment shader was successfully compiled to run on hardware. Vertex shader(s) failed to link, no fragment shader(s) defined.
в чем тут загвоздка-то?