Example #1
0
	def close(self):
		if self.program:
			shaders.glDeleteProgram(self.program)
		if self.vs:
			shaders.glDeleteShader(self.vs)
		if self.fs:
			shaders.glDeleteShader(self.fs)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
 def delete(self):
     glDeleteShader(self.shader)
Example #6
0
 def __del__(self):
     if hasattr(self, 'id'):
         shaders.glDeleteShader(self.id)