def close(self): if self.program: shaders.glDeleteProgram(self.program) if self.vs: shaders.glDeleteShader(self.vs) if self.fs: shaders.glDeleteShader(self.fs)
def compile_from_source(self, shader_codes: dict): """ :param shader_codes: {GL_VERTEX_SHADER:code_string, GL_FRAGMENT_SHADER:code_string, } """ shaders = [] for shader_type in shader_codes: shader = self.compile(shader_type, shader_codes[shader_type]) if shader is not None: logger.info("Compile %s %s." % (self.name, shader_type)) shaders.append(shader) self.program = glCreateProgram() # glProgramParameteri(self.program, GL_PROGRAM_SEPARABLE, GL_TRUE) glProgramParameteri(self.program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE) for shader in shaders: glAttachShader(self.program, shader) glLinkProgram(self.program) for shader in shaders: glDetachShader(self.program, shader) glDeleteShader(shader)
def __init__(self, vertex_code=None, fragment_code=None, vertex_file=None, fragment_file=None): if vertex_file is not None: vs = self.vertex_from_file(vertex_file) elif vertex_code is not None: vs = self.vertex_from_string(vertex_code) else: raise ValueError('You need to supply a vertex shader!') if fragment_file is not None: fs = self.fragment_from_file(vertex_file) elif fragment_code is not None: fs = self.fragment_from_string(fragment_code) else: raise ValueError('You need to supply a fragment shader!') self.id = shaders.glCreateProgram() shaders.glAttachShader(self.id, vs) shaders.glAttachShader(self.id, fs) shaders.glLinkProgram(self.id) if shaders.glGetProgramiv(self.id, shaders.GL_LINK_STATUS) != gl.GL_TRUE: print shaders.glGetProgramInfoLog(self.id) raise RuntimeError(shaders.glGetProgramInfoLog(self.id)) # cleanup shaders.glDeleteShader(vs) shaders.glDeleteShader(fs)
def delete(self): glDeleteShader(self.shader)
def __del__(self): if hasattr(self, 'id'): shaders.glDeleteShader(self.id)