1
2 """
3 Class to simplify the use of GLSL programs.
4
5 Copyright (C) 2007 "Peter Roesch" <Peter.Roesch@fh-augsburg.de>
6
7 This code is licensed under the PyOpenGL License.
8 Details are given in the file license.txt included in this distribution.
9 """
10
11
12
13
14
15
16
17
18
19 import sys
20
22 """
23 Any error that might have occured that will make a shader program unusable.
24 """
25 pass
26
27 try:
28 from OpenGL.GLUT import *
29 from OpenGL.GL import *
30 from OpenGL.GLU import *
31 from OpenGL.GL.ARB.shader_objects import *
32 from OpenGL.GL.ARB.fragment_shader import *
33 from OpenGL.GL.ARB.vertex_shader import *
34 except:
35 raise
36
37
39 """
40 Manages GLSL programs.
41 """
43 self._requiredExtensions = [
44 "GL_ARB_fragment_shader",
45 "GL_ARB_vertex_shader",
46 "GL_ARB_shader_objects",
47 "GL_ARB_shading_language_100",
48 "GL_ARB_vertex_shader",
49 "GL_ARB_fragment_shader"]
50 self.checkExtensions(self._requiredExtensions)
51
52 if not bool(glCreateProgramObjectARB):
53 raise ShaderError("Impossible to create a shader program object.")
54 self._shaderProgramID = glCreateProgramObjectARB()
55 self._checkOpenGLError()
56 self._programReady = False
57 self._isEnabled = False
58 self._shaderObjectList = []
59
61 """
62 Checks if all extensions in a list are present.
63 """
64 for ext in extensions:
65 if not ext:
66 raise ShaderError("Driver does not support extension %s." % (ext))
67
78
80 """
81 Disables and removes all shader programs.
82 """
83 for shaderID in self._shaderObjectList:
84 glDetachObjectARB(self._shaderProgramID, shaderID)
85 glDeleteObjectARB(shaderID)
86 self._shaderObjectList.remove(shaderID)
87 self._checkOpenGLError()
88 glDeleteObjectARB(self._shaderProgramID)
89 self._checkOpenGLError()
90 self._shaderProgramID = glCreateProgramObjectARB()
91 self._checkOpenGLError()
92 self._programReady = False
93
95 """
96 Reads a shader program from a file.
97
98 The program is loaded and compiled.
99 """
100 sourceString = open(fileName, 'r').read()
101 self.add_shader_text(shaderType, sourceString)
102
103 - def add_shader_text(self, shaderType, sourceString):
104 """
105 Loads a program from string and compiles it.
106 """
107 shaderHandle = glCreateShaderObjectARB(shaderType)
108 self._checkOpenGLError()
109 glShaderSourceARB(shaderHandle, [sourceString])
110 self._checkOpenGLError()
111 glCompileShaderARB(shaderHandle)
112 success = glGetObjectParameterivARB(shaderHandle,
113 GL_OBJECT_COMPILE_STATUS_ARB)
114 self._checkOpenGLError()
115 if not success:
116 raise ShaderError(glGetInfoLogARB(shaderHandle))
117 glAttachObjectARB(self._shaderProgramID, shaderHandle)
118 self._checkOpenGLError()
119 self._shaderObjectList.append(shaderHandle)
120
122 """
123 Links compiled shader programs.
124 """
125 glLinkProgramARB(self._shaderProgramID)
126 self._checkOpenGLError()
127 success = glGetObjectParameterivARB(self._shaderProgramID,
128 GL_OBJECT_LINK_STATUS_ARB)
129 if not success:
130 raise ShaderError(glGetInfoLogARB(self._shaderProgramID))
131 else:
132 self._programReady = True
133
135 """
136 Activates shader programs.
137 """
138 if self._programReady:
139 glUseProgramObjectARB(self._shaderProgramID)
140 self._isEnabled=True
141 self._checkOpenGLError()
142 else:
143 print "Shaders not compiled/linked properly, enable() failed"
144
146 """
147 De-activates shader programs.
148 """
149 glUseProgramObjectARB(0)
150 self._isEnabled=False
151 self._checkOpenGLError()
152
167
169 """
170 Finds the index of an attribute variable.
171 """
172 if not self._programReady:
173 print "\nShaders not compiled/linked properly"
174 result = -1
175 else:
176 result = glGetAttribLocationARB(self._shaderProgramID, attributeName)
177 self._checkOpenGLError()
178 if result < 0:
179 raise ShaderError('Attribute "%s" not known to the shader' % (attributeName))
180 else:
181 return result
182
184 return self._isEnabled
185
192
205
206
207 if __name__ == '__main__':
208 glutInit(sys.argv)
209 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
210 glutInitWindowSize(100, 100)
211 glutCreateWindow("shaderProg Test")
212
213
214 Sp = ShaderProgram()
215 Sp.addShader(GL_VERTEX_SHADER_ARB, "temperature.vert")
216 Sp.addShader(GL_FRAGMENT_SHADER_ARB, "temperature.frag")
217 Sp.linkShaders()
218 print "Index of variable CoolestTemp: ", \
219 Sp.indexOfUniformVariable("CoolestTemp")
220 Sp.enable()
221 print "Index of attribute VertexTemp: ", \
222 Sp.indexOfVertexAttribute("VertexTemp")
223 glVertexAttrib1fNV(Sp.indexOfVertexAttribute("VertexTemp"), 12.3)
224 Sp.disable()
225 Sp.reset()
226 print 'OK'
227