示例#1
0
文件: shader.py 项目: los-cocos/cocos
    def _compile(self):
        if self.shader:
            return
        if self.compiling:
            return
        self.compiling = True

        self.shader = gl.glCreateShaderObjectARB(self.shaderType())
        if self.shader == 0:
            raise GLSLException('faled to create shader object')

        prog = c_char_p(self.prog)
        length = c_int(-1)
        gl.glShaderSourceARB(self.shader,
                          1,
                          cast(byref(prog), POINTER(POINTER(c_char))),
                          byref(length))
        gl.glCompileShaderARB(self.shader)

        self.compiling = False

        compile_status = c_int(0)
        gl.glGetObjectParameterivARB(self.shader, gl.GL_OBJECT_COMPILE_STATUS_ARB, byref(compile_status))

        if not compile_status.value:
            err = glsl_log(self.shader)
            gl.glDeleteObjectARB(self.shader)
            self.shader = 0
            raise GLSLException('failed to compile shader', err)
示例#2
0
    def _compile(self):
        if self.shader:
            return
        if self.compiling:
            return
        self.compiling = True

        self.shader = gl.glCreateShaderObjectARB(self.shaderType())
        if self.shader == 0:
            raise GLSLException('faled to create shader object')

        prog = c_char_p(self.prog)
        length = c_int(-1)
        gl.glShaderSourceARB(self.shader, 1,
                             cast(byref(prog), POINTER(POINTER(c_char))),
                             byref(length))
        gl.glCompileShaderARB(self.shader)

        self.compiling = False

        compile_status = c_int(0)
        gl.glGetObjectParameterivARB(self.shader,
                                     gl.GL_OBJECT_COMPILE_STATUS_ARB,
                                     byref(compile_status))

        if not compile_status.value:
            err = glsl_log(self.shader)
            gl.glDeleteObjectARB(self.shader)
            self.shader = 0
            raise GLSLException('failed to compile shader', err)
示例#3
0
 def setShader(self, shader):
     if isinstance(shader, FragmentShader):
         self.fragment_shader = shader
     if isinstance(shader, VertexShader):
         self.vertex_shader = shader
     if self.program != 0:
         gl.glDeleteObjectARB(self.program)
示例#4
0
    def link(self):
        if self.vertex_shader is not None:
            self.vertex_shader.compileFlat()
        if self.fragment_shader is not None:
            self.fragment_shader.compileFlat()

        self.program = gl.glCreateProgramObjectARB()
        if self.program == 0:
            raise GLSLException('failed to create program object')

        if self.vertex_shader is not None:
            self.vertex_shader.attachFlat(self.program)
        if self.fragment_shader is not None:
            self.fragment_shader.attachFlat(self.program)

        gl.glLinkProgramARB(self.program)

        link_status = c_int(0)
        gl.glGetObjectParameterivARB(self.program,
                                     gl.GL_OBJECT_LINK_STATUS_ARB,
                                     byref(link_status))
        if link_status.value == 0:
            err = glsl_log(self.program)
            gl.glDeleteObjectARB(self.program)
            self.program = 0
            raise GLSLException('failed to link shader', err)

        self.__class__._uloc_ = {}
        self.__class__._vloc_ = {}

        return self.program
示例#5
0
    def compileFlat(self):
        if self.isCompiled():
            return

        self.shader = gl.glCreateShaderObjectARB(self.shaderType())
        if self.shader == 0:
            raise GLSLException('faled to create shader object')

        all_source = [b'\n'.join(self._source())]
        prog = (c_char_p * len(all_source))(*all_source)
        length = (c_int * len(all_source))(-1)
        gl.glShaderSourceARB(self.shader, len(all_source),
                             cast(prog, POINTER(POINTER(c_char))), length)
        gl.glCompileShaderARB(self.shader)

        compile_status = c_int(0)
        gl.glGetObjectParameterivARB(self.shader,
                                     gl.GL_OBJECT_COMPILE_STATUS_ARB,
                                     byref(compile_status))

        if not compile_status.value:
            err = glsl_log(self.shader)
            gl.glDeleteObjectARB(self.shader)
            self.shader = 0
            raise GLSLException('failed to compile shader', err)
示例#6
0
文件: shader.py 项目: los-cocos/cocos
 def setShader(self, shader):
     if isinstance(shader, FragmentShader):
         self.fragment_shader = shader
     if isinstance(shader, VertexShader):
         self.vertex_shader = shader
     if self.program != 0:
         gl.glDeleteObjectARB(self.program)
示例#7
0
文件: shader.py 项目: los-cocos/cocos
    def link(self):
        if self.vertex_shader is not None:
            self.vertex_shader.compileFlat()
        if self.fragment_shader is not None:
            self.fragment_shader.compileFlat()

        self.program = gl.glCreateProgramObjectARB()
        if self.program == 0:
            raise GLSLException('failed to create program object')

        if self.vertex_shader is not None:
            self.vertex_shader.attachFlat(self.program)
        if self.fragment_shader is not None:
            self.fragment_shader.attachFlat(self.program)

        gl.glLinkProgramARB(self.program)

        link_status = c_int(0)
        gl.glGetObjectParameterivARB(self.program, gl.GL_OBJECT_LINK_STATUS_ARB, byref(link_status))
        if link_status.value == 0:
            err = glsl_log(self.program)
            gl.glDeleteObjectARB(self.program)
            self.program = 0
            raise GLSLException('failed to link shader', err)

        self.__class__._uloc_ = {}
        self.__class__._vloc_ = {}

        return self.program
示例#8
0
文件: shader.py 项目: los-cocos/cocos
    def compileFlat(self):
        if self.isCompiled():
            return

        self.shader = gl.glCreateShaderObjectARB(self.shaderType())
        if self.shader == 0:
            raise GLSLException('faled to create shader object')

        all_source = [b'\n'.join(self._source())]
        prog = (c_char_p * len(all_source))(*all_source)
        length = (c_int * len(all_source))(-1)
        gl.glShaderSourceARB(self.shader,
                          len(all_source),
                          cast(prog, POINTER(POINTER(c_char))),
                          length)
        gl.glCompileShaderARB(self.shader)

        compile_status = c_int(0)
        gl.glGetObjectParameterivARB(self.shader, gl.GL_OBJECT_COMPILE_STATUS_ARB, byref(compile_status))

        if not compile_status.value:
            err = glsl_log(self.shader)
            gl.glDeleteObjectARB(self.shader)
            self.shader = 0
            raise GLSLException('failed to compile shader', err)
示例#9
0
文件: shader.py 项目: pertrush1/cocos
 def destroy(self):
     if self.program != 0:
         # try added to fix special case of spureous exception
         # when terminating test_shader
         try:
             gl.glDeleteObjectARB(self.program)
         except ImportError:
             if sys.meta_path is None:
                 # Python is likely shutting down, ignore
                 pass
             else:
                 raise
示例#10
0
def compileProgram(vertexSource=None, fragmentSource=None):
        """Create and compile a vertex and fragment shader pair from their sources (strings)
        """
        
        def compileShader( source, shaderType ):
                """Compile shader source of given type (only needed by compileProgram)"""
                shader = GL.glCreateShaderObjectARB(shaderType)
                
                prog = c_char_p(source)
                length = c_int(-1)
                GL.glShaderSourceARB(shader,
                                  1,
                                  cast(byref(prog), POINTER(POINTER(c_char))),
                                  byref(length))
                GL.glCompileShaderARB(shader)

                #check for errors
                status = c_int()
                GL.glGetShaderiv(shader, GL.GL_COMPILE_STATUS, byref(status))
                if not status.value:
                    print_log(shader)
                    GL.glDeleteShader(shader)
                    raise ValueError, 'Shader compilation failed'
                return shader
        
        program = GL.glCreateProgramObjectARB()

        if vertexSource:
                vertexShader = compileShader(
                        vertexSource, GL.GL_VERTEX_SHADER_ARB
                )
                GL.glAttachObjectARB(program, vertexShader)
        if fragmentSource:
                fragmentShader = compileShader(
                        fragmentSource, GL.GL_FRAGMENT_SHADER_ARB
                )
                GL.glAttachObjectARB(program, fragmentShader)

        GL.glValidateProgramARB( program )
        GL.glLinkProgramARB(program)

        if vertexShader:
                GL.glDeleteObjectARB(vertexShader)
        if fragmentShader:
                GL.glDeleteObjectARB(fragmentShader)

        return program
示例#11
0
    def __init__(self, vertexSource=None, fragmentSource=None):

        def compileShader(source, shaderType):
            """Compile shader source of given type (only needed by compileProgram)
            """
            shader = GL.glCreateShaderObjectARB(shaderType)
            # if Py3 then we need to convert our (unicode) str into bytes for C
            if type(source) != bytes:
                source = source.encode()
            prog = c_char_p(source)
            length = c_int(-1)
            GL.glShaderSourceARB(shader,
                                 1,
                                 cast(byref(prog), POINTER(POINTER(c_char))),
                                 byref(length))
            GL.glCompileShaderARB(shader)

            # check for errors
            status = c_int()
            GL.glGetShaderiv(shader, GL.GL_COMPILE_STATUS, byref(status))
            if not status.value:
                print_log(shader)
                GL.glDeleteShader(shader)
                raise ValueError('Shader compilation failed')
            return shader

        self.handle = GL.glCreateProgramObjectARB()

        if vertexSource:
            vertexShader = compileShader(
                vertexSource, GL.GL_VERTEX_SHADER_ARB
            )
            GL.glAttachObjectARB(self.handle, vertexShader)
        if fragmentSource:
            fragmentShader = compileShader(
                fragmentSource, GL.GL_FRAGMENT_SHADER_ARB
            )
            GL.glAttachObjectARB(self.handle, fragmentShader)

        GL.glValidateProgramARB(self.handle)
        GL.glLinkProgramARB(self.handle)

        if vertexShader:
            GL.glDeleteObjectARB(vertexShader)
        if fragmentShader:
            GL.glDeleteObjectARB(fragmentShader)
示例#12
0
def compileProgram(vertexSource=None, fragmentSource=None):
    """Create and compile a vertex and fragment shader pair from their sources (strings)
        """
    def compileShader(source, shaderType):
        """Compile shader source of given type (only needed by compileProgram)"""
        shader = GL.glCreateShaderObjectARB(shaderType)

        prog = c_char_p(source)
        length = c_int(-1)
        GL.glShaderSourceARB(shader, 1,
                             cast(byref(prog), POINTER(POINTER(c_char))),
                             byref(length))
        GL.glCompileShaderARB(shader)

        #check for errors
        status = c_int()
        GL.glGetShaderiv(shader, GL.GL_COMPILE_STATUS, byref(status))
        if not status.value:
            print_log(shader)
            GL.glDeleteShader(shader)
            raise ValueError, 'Shader compilation failed'
        return shader

    program = GL.glCreateProgramObjectARB()

    if vertexSource:
        vertexShader = compileShader(vertexSource, GL.GL_VERTEX_SHADER_ARB)
        GL.glAttachObjectARB(program, vertexShader)
    if fragmentSource:
        fragmentShader = compileShader(fragmentSource,
                                       GL.GL_FRAGMENT_SHADER_ARB)
        GL.glAttachObjectARB(program, fragmentShader)

    GL.glValidateProgramARB(program)
    GL.glLinkProgramARB(program)

    if vertexShader:
        GL.glDeleteObjectARB(vertexShader)
    if fragmentShader:
        GL.glDeleteObjectARB(fragmentShader)

    return program
示例#13
0
def compileProgram(vertex=None, fragment=None, attachments=[]):
    """Create and compile a vertex and fragment shader pair from their sources (strings)

    Usage::

        prog = compileProgram(vertex, fragment, attachments=[])

    where:

        - vertex is the main vertex shader source (or ShaderCode object)
        - fragment is the main fragment shader source (or ShaderCode object)
        - attachments is a list of ShaderCode objects, with valid shaderType set

    """

    #Derived from shader compilation code in PsychoPy 1.65.02, with permission
    # from JWP to reuse under more permissive license

    def compileShader(source, shaderType):
        """Compile shader source of given type (only needed by compileProgram)"""
        shader = gl.glCreateShaderObjectARB(shaderType)

        #were we given a source string or a ShaderCode object?
        if hasattr(source, 'src'): source = source.src

        prog = c_char_p(source)
        length = c_int(-1)
        gl.glShaderSourceARB(shader, 1,
                             cast(byref(prog), POINTER(POINTER(c_char))),
                             byref(length))
        gl.glCompileShaderARB(shader)

        #check for errors
        status = c_int()
        gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS, byref(status))
        if not status.value:
            #	retrieve the log length
            gl.glGetShaderiv(shader, gl.GL_INFO_LOG_LENGTH, byref(status))
            # create a buffer for the log
            buffer = create_string_buffer(status.value)  #from ctypes
            # retrieve the log text
            gl.glGetProgramInfoLog(shader, status, None, buffer)
            # print the log to the console
            print buffer.value
            gl.glDeleteShader(shader)
            raise ValueError, 'Shader compilation failed'
        return shader

    program = gl.glCreateProgramObjectARB()

    #compile attachments before main vertex and frag progs
    for thisAttachment in attachments:
        attachment = compileShader(thisAttachment, thisAttachment.type)
        gl.glAttachObjectARB(program, attachment)
    if vertex:
        vertexShader = compileShader(vertex, VERT)
        gl.glAttachObjectARB(program, vertexShader)
    if fragment:
        fragmentShader = compileShader(fragment, FRAG)
        gl.glAttachObjectARB(program, fragmentShader)
    #compile the overall program
    gl.glValidateProgramARB(program)
    gl.glLinkProgramARB(program)
    #cleanup
    if vertex:
        gl.glDeleteObjectARB(vertexShader)
    if fragment:
        gl.glDeleteObjectARB(fragmentShader)
    return program
示例#14
0
 def destroy(self):
     if self.program != 0:
         gl.glDeleteObjectARB(self.program)
示例#15
0
 def destroy(self):
     if self.shader != 0:
         gl.glDeleteObjectARB(self.shader)
示例#16
0
def compileProgram(vertex=None, fragment=None, attachments=[]):
    """Create and compile a vertex and fragment shader pair from their sources (strings)

    Usage::

        prog = compileProgram(vertex, fragment, attachments=[])

    where:

        - vertex is the main vertex shader source (or ShaderCode object)
        - fragment is the main fragment shader source (or ShaderCode object)
        - attachments is a list of ShaderCode objects, with valid shaderType set

    """

    #Derived from shader compilation code in PsychoPy 1.65.02, with permission
    # from JWP to reuse under more permissive license

    def compileShader( source, shaderType ):
            """Compile shader source of given type (only needed by compileProgram)"""
            shader = gl.glCreateShaderObjectARB(shaderType)

            #were we given a source string or a ShaderCode object?
            if hasattr(source, 'src'): source = source.src

            prog = c_char_p(source)
            length = c_int(-1)
            gl.glShaderSourceARB(shader,
                              1,
                              cast(byref(prog), POINTER(POINTER(c_char))),
                              byref(length))
            gl.glCompileShaderARB(shader)

            #check for errors
            status = c_int()
            gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS, byref(status))
            if not status.value:
                #	retrieve the log length
                gl.glGetShaderiv(shader, gl.GL_INFO_LOG_LENGTH, byref(status))
                # create a buffer for the log
                buffer = create_string_buffer(status.value)#from ctypes
                # retrieve the log text
                gl.glGetProgramInfoLog(shader, status, None, buffer)
                # print the log to the console
                print buffer.value
                gl.glDeleteShader(shader)
                raise ValueError, 'Shader compilation failed'
            return shader

    program = gl.glCreateProgramObjectARB()

    #compile attachments before main vertex and frag progs
    for thisAttachment in attachments:
        attachment = compileShader(thisAttachment, thisAttachment.type)
        gl.glAttachObjectARB(program, attachment)
    if vertex:
            vertexShader = compileShader(vertex, VERT)
            gl.glAttachObjectARB(program, vertexShader)
    if fragment:
            fragmentShader = compileShader(fragment, FRAG)
            gl.glAttachObjectARB(program, fragmentShader)
    #compile the overall program
    gl.glValidateProgramARB( program )
    gl.glLinkProgramARB(program)
    #cleanup
    if vertex:
            gl.glDeleteObjectARB(vertexShader)
    if fragment:
            gl.glDeleteObjectARB(fragmentShader)
    return program
示例#17
0
文件: shader.py 项目: los-cocos/cocos
 def destroy(self):
     if self.program != 0:
         gl.glDeleteObjectARB(self.program)
示例#18
0
文件: shader.py 项目: los-cocos/cocos
 def destroy(self):
     if self.shader != 0:
         gl.glDeleteObjectARB(self.shader)