def __init__(self, archivo_vert, archivo_frag, nombre_vert="Vertex Shader", nombre_frag="Fragment Shader"): print("Shader creado") # Creación de shaders y programa self.vshader = glCreateShader(GL_VERTEX_SHADER) self.fshader = glCreateShader(GL_FRAGMENT_SHADER) self.programa = glCreateProgram() # Cargamos los datos de los archivos en los shaders self.cargar_datos(self.vshader, archivo_vert) self.cargar_datos(self.fshader, archivo_frag) # Compilamos los shaders resultado_vert = self.compilar(self.vshader, nombre_vert) resultado_frag = self.compilar(self.fshader, nombre_frag) # Error en la compilación if (resultado_vert != 1) or (resultado_frag != 1): self.destruir() # Sin errores hasta ahora else: # Enlazamos los shaders al programa glAttachShader(self.programa, self.vshader) glAttachShader(self.programa, self.fshader) # Enlazamos el programa glLinkProgram(self.programa) # Desenlazaos y eliminamos los shaders glDetachShader(self.programa, self.vshader) glDetachShader(self.programa, self.fshader) glDeleteShader(self.vshader) glDeleteShader(self.fshader) # Errores durante el enlace resultado_progr = glGetProgramiv(self.programa, GL_LINK_STATUS) if resultado_progr != 1: self.destruir()
def add_shader(self, source, shader_type): """ Helper function for compiling a GLSL shader Parameters ---------- source : str String containing shader source code shader_type : valid OpenGL shader type Type of shader to compile Returns ------- value : int Identifier for shader if compilation is successful """ try: shader_id = glCreateShader(shader_type) glShaderSource(shader_id, source) glCompileShader(shader_id) if glGetShaderiv(shader_id, GL_COMPILE_STATUS) != GL_TRUE: info = glGetShaderInfoLog(shader_id) raise RuntimeError('Shader compilation failed: %s' % (info)) return shader_id except: glDeleteShader(shader_id) raise
def __load_shader(self, shader_filename, shader_type): """Load shader of specific type from file.""" shader_source = '' with open(shader_filename) as shader_file: shader_source = shader_file.read() assert shader_source shader_id = glCreateShader(shader_type) self.__shaders[shader_type].append(shader_id) glShaderSource(shader_id, shader_source) glCompileShader(shader_id)
def create_shader(self, source, shadertype): shader = glCreateShader(shadertype) # PyOpenGL bug ? He's waiting for a list of string, not a string # on some card, it failed :) if isinstance(source, basestring): source = [source] glShaderSource(shader, source) glCompileShader(shader) message = self.get_shader_log(shader) if message: pymt_logger.debug('Shader: shader message: %s' % message) return shader
def make_shader(shadertype, source): shader = glCreateShader(shadertype) glShaderSource(shader, source) glCompileShader(shader) retval = ctypes.c_uint(GL_UNSIGNED_INT) glGetShaderiv(shader, GL_COMPILE_STATUS, retval) if not retval: print >> sys.stderr, "Failed to compile shader." print glGetShaderInfoLog(shader) glDeleteShader(shader) raise Exception("Failed to compile shader.") return shader
def add_shader(self, source, shader_type): try: #print "TEST" #print source shader_id = glCreateShader(shader_type) glShaderSource(shader_id, source) glCompileShader(shader_id) if glGetShaderiv(shader_id, GL_COMPILE_STATUS) != GL_TRUE: info = glGetShaderInfoLog(shader_id) raise RuntimeError('Shader compilation failed: %s' % (info)) return shader_id except: glDeleteShader(shader_id) raise
def _createShader(self, shadertype, source): try: shader = None shader = glCreateShader(shadertype) glShaderSource(shader, source) glCompileShader(shader) if glGetShaderiv(shader, GL_COMPILE_STATUS) != GL_TRUE: info = glGetShaderInfoLog(shader) raise Exception, "Unable to compile shader. Infolog:\n%s" % (info,) return shader except Exception: # Cleanup on exception if shader != None: glDeleteShader(shader) raise
def attachShader(self,type,source): shader = glCreateShader(type) glShaderSource(shader,source) glCompileShader(shader) shader_log = glGetShaderInfoLog(shader) if shader_log: if type == GL_FRAGMENT_SHADER: str_type = "GL_FRAGMENT_SHADER" elif type == GL_VERTEX_SHADER: str_type = "GL_VERTEX_SHADER" elif type == GL_GEOMETRY_SHADER: str_type = "GL_GEOMETRY_SHADER" else: str_type = "unkown shader type %s" % str(type) raise RuntimeError("%s\n%s" % (str_type, shader_log)) glAttachShader(self.program_id, shader) self._shaders.append(shader)
def _alloc(self): # pylint: disable=assignment-from-no-return self._hnd = glCreateShader(self._kind) logging.info('glCreateShader(%s) -> %d', self._kind.name, self._hnd) if self._hnd == 0: raise ValueError('glCreateShader failed')
def __alloc(cls, shader_type): sobj = super().__new__(cls) sobj.sid = c_uint(glCreateShader(shader_type)) sobj.owned = True return sobj