self._vertexString = vertexProgram
self._fragmentString = fragmentProgram
try:
- self._vertexProgram = shaders.compileShader(vertexProgram, GL_VERTEX_SHADER)
- self._fragmentProgram = shaders.compileShader(fragmentProgram, GL_FRAGMENT_SHADER)
- self._program = shaders.compileProgram(self._vertexProgram, self._fragmentProgram)
+ vertexShader = shaders.compileShader(vertexProgram, GL_VERTEX_SHADER)
+ fragmentShader = shaders.compileShader(fragmentProgram, GL_FRAGMENT_SHADER)
+
+ #shader.compileProgram tries to return the shader program as a overloaded int. But the return value of a shader does not always fit in a int (needs to be a long). So we do raw OpenGL calls.
+ # self._program = shaders.compileProgram(self._vertexProgram, self._fragmentProgram)
+ self._program = glCreateProgram()
+ glAttachShader(self._program, vertexShader)
+ glAttachShader(self._program, fragmentShader)
+ glLinkProgram(self._program)
+ # Validation has to occur *after* linking
+ glValidateProgram(self._program)
+ if glGetProgramiv(self._program, GL_VALIDATE_STATUS) == GL_FALSE:
+ raise RuntimeError("Validation failure: %s"%(glGetProgramInfoLog(self._program)))
+ if glGetProgramiv(self._program, GL_LINK_STATUS) == GL_FALSE:
+ raise RuntimeError("Link failure: %s" % (glGetProgramInfoLog(self._program)))
+ glDeleteShader(vertexShader)
+ glDeleteShader(fragmentShader)
except RuntimeError, e:
print str(e)
self._program = None
def release(self):
if self._program is not None:
- shaders.glDeleteShader(self._vertexProgram)
- shaders.glDeleteShader(self._fragmentProgram)
glDeleteProgram(self._program)
self._program = None
xml.write(' <v3>%i</v3>\n' % (idx + idxOffset + 2))
xml.write(' </triangle>\n')
xml.write(' </volume>\n')
- xml.write(' </mesh>\n')
idxOffset += len(m.vertexes)
+ xml.write(' </mesh>\n')
xml.write(' </object>\n')
n += 1