Пример #1
0
    def __init__(self,vs: str,fs: str,MaxText=8):
        self.MaxQuadCount = 2000
        self.MaxVertexCount = self.MaxQuadCount * 4
        self.MaxIndexCount = self.MaxQuadCount * 6
        self.MaxTextures = MaxText
        self.QuadVA = 0
        self.QuadVB = 0
        self.QuadIB = 0
        self.WhiteTexture = 0 #The first texture unit is reserv for a 1x1 white texture
        self.IndexCount = 0
        self.QuadBuffer = [Vertex()]
        self.QuadBufferPtr = 0
        self.TextureSlots = [0] * self.MaxTextures        
        self.TextureSlotIndex = 1
        self.TexCoords = [vec2(0,0), vec2(1,0), vec2(1,1), vec2(0,1)]
        self.shader = Shader(vs,fs)

        print("Texture Units: " + str(self.MaxTextures))

        self.QuadVA = glGenVertexArrays(1)
        glBindVertexArray(self.QuadVA)

        self.QuadVB = glGenBuffers(1)
        glBindBuffer(GL_ARRAY_BUFFER, self.QuadVB)
        glBufferData(GL_ARRAY_BUFFER, self.MaxVertexCount * 10 * sizeOfFloat, None, GL_DYNAMIC_DRAW)

        #Layout Position
        glEnableVertexAttribArray(0)
        glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(0)) #The last parm is the offset, can't find a offset function
        
        #Layout Color
        glEnableVertexAttribArray(1)
        glVertexAttribPointer(1,4,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(12))

        #Layout TexCoords
        glEnableVertexAttribArray(2)
        glVertexAttribPointer(2,2,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(28))

        #Layout TexIndex
        glEnableVertexAttribArray(3)
        glVertexAttribPointer(3,1,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(36))
        
        self.shader.Bind()
        loc = self.shader.GetUniformLocation("u_Textures")
        samplers = []
        for i in range(0,self.MaxTextures,1):
            samplers.append(i)
        glUniform1iv(loc, self.MaxTextures ,numpy.array(samplers,dtype=numpy.int32))

        indices = [0] * self.MaxIndexCount
        offset = 0
        for i in range(0,self.MaxIndexCount,6):
            indices[i + 0] = 0 + offset
            indices[i + 1] = 1 + offset
            indices[i + 2] = 2 + offset

            indices[i + 3] = 2 + offset
            indices[i + 4] = 3 + offset
            indices[i + 5] = 0 + offset

            offset += 4
        
        self.QuadIB = glGenBuffers(1)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,self.QuadIB)
        glBufferData(GL_ELEMENT_ARRAY_BUFFER,size=None,data=numpy.array(indices,dtype=numpy.uint32),usage=GL_STATIC_DRAW)

        self.WhiteTexture = glGenTextures(1)
        glBindTexture(GL_TEXTURE_2D, self.WhiteTexture)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
        
        white_color = [[255,255,255,255]]
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, white_color)

        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

        self.TextureSlots[0] = self.WhiteTexture
        for i in range(1,self.MaxTextures,1):
            self.TextureSlots[i] = 0