Hi everyone, I am trying to make a transparent screen by hide the background color with win32api
It work with pygame in 2D. However, when I use pyopengl to make a 3D platform, The back ground didn't transparent
I use window 7 64bits, python 2.7
Here is the code for the main.py:
In the result in the attack, you can see that the background didn't transparent.
For any help, thank you so much!
It work with pygame in 2D. However, when I use pyopengl to make a 3D platform, The back ground didn't transparent
I use window 7 64bits, python 2.7
Here is the code for the main.py:
import sys, tran from pygame.locals import * from pygame.constants import * from OpenGL.GL import * from OpenGL.GLU import * import os import pygame as pg # IMPORT OBJECT LOADER from objLoader import * pg.init() viewport = (800,600) hx = viewport[0]/2 hy = viewport[1]/2 srf = pg.display.set_mode(viewport, OPENGL | DOUBLEBUF) glLightfv(GL_LIGHT0, GL_POSITION, (-40, 200, 100, 0.0)) glLightfv(GL_LIGHT0, GL_AMBIENT, (0.2, 0.2, 0.2, 1.0)) glLightfv(GL_LIGHT0, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0)) glEnable(GL_LIGHT0) glEnable(GL_LIGHTING) glEnable(GL_COLOR_MATERIAL) glEnable(GL_DEPTH_TEST) glShadeModel(GL_SMOOTH) # most obj files expect to be smooth-shaded # LOAD OBJECT AFTER pg INIT # obj = OBJ(sys.argv[1], swapyz=True) # obj = OBJ('test.obj', swapyz=True) # os.chdir('model/T80') # obj = OBJ('model/T80/T80.obj', swapyz=True) obj = OBJ('T80obj.obj', swapyz=True) clock = pg.time.Clock() glMatrixMode(GL_PROJECTION) glLoadIdentity() width, height = viewport gluPerspective(90.0, width/float(height), 1, 100.0) glEnable(GL_DEPTH_TEST) glMatrixMode(GL_MODELVIEW) rx, ry = (0,0) tx, ty = (0,0) zpos = 5 rotate = move = False hwnd = pg.display.get_wm_info()["window"] r,g,b = 0,0,0 while 1: clock.tick(30) for e in pg.event.get(): if e.type == QUIT: sys.exit() elif e.type == KEYDOWN and e.key == K_ESCAPE: sys.exit() elif e.type == MOUSEBUTTONDOWN: if e.button == 4: zpos = max(1, zpos-1) elif e.button == 5: zpos += 1 elif e.button == 1: rotate = True elif e.button == 3: move = True elif e.type == MOUSEBUTTONUP: if e.button == 1: rotate = False elif e.button == 3: move = False elif e.type == MOUSEMOTION: i, j = e.rel if rotate: rx += i ry += j if move: tx += i ty -= j glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() # RENDER OBJECT glTranslate(tx/20., ty/20., - zpos) glRotate(ry, 1, 0, 0) glRotate(rx, 0, 1, 0) glCallList(obj.gl_list) pg.draw.rect(srf, (255,0,0), (50, 50, 100, 100), 2) r += 1; g += 1; b += 1; print(r,g,b) # tran.tran(hwnd,(r,g,b,)); pg.display.flip() pg.draw.rect(srf, (255,0,0), (50, 50, 100, 100), 2) glClearColor(0, 0, 0, 0) tran.tran(hwnd,(0,0,0))objLoader.py
import pygame from tqdm import tqdm from OpenGL.GL import * def MTL(filename): contents = {} mtl = None for line in open(filename, "r"): if line.startswith('#'): continue values = line.split() if not values: continue if values[0] == 'newmtl': mtl = contents[values[1]] = {} elif mtl is None: raise ValueError, "mtl file doesn't start with newmtl stmt" elif values[0] == 'map_Kd': # load the texture referred to by this declaration mtl[values[0]] = values[1] surf = pygame.image.load(mtl['map_Kd']) image = pygame.image.tostring(surf, 'RGBA', 1) ix, iy = surf.get_rect().size texid = mtl['texture_Kd'] = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, texid) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, image) else: mtl[values[0]] = map(float, values[1:]) return contents class OBJ: def __init__(self, filename, swapyz=False): """Loads a Wavefront OBJ file. """ self.vertices = [] self.normals = [] self.texcoords = [] self.faces = [] material = None for line in open(filename, "r"): if line.startswith('#'): continue values = line.split() if not values: continue if values[0] == 'v': v = map(float, values[1:4]) if swapyz: v = v[0], v[2], v[1] self.vertices.append(v) elif values[0] == 'vn': v = map(float, values[1:4]) if swapyz: v = v[0], v[2], v[1] self.normals.append(v) elif values[0] == 'vt': self.texcoords.append(map(float, values[1:3])) elif values[0] in ('usemtl', 'usemat'): material = values[1] elif values[0] == 'mtllib': self.mtl = MTL(values[1]) elif values[0] == 'f': face = [] texcoords = [] norms = [] for v in values[1:]: w = v.split('/') face.append(int(w[0])) if len(w) >= 2 and len(w[1]) > 0: texcoords.append(int(w[1])) else: texcoords.append(0) if len(w) >= 3 and len(w[2]) > 0: norms.append(int(w[2])) else: norms.append(0) self.faces.append((face, norms, texcoords, material)) self.gl_list = glGenLists(1) glNewList(self.gl_list, GL_COMPILE) glEnable(GL_TEXTURE_2D) glFrontFace(GL_CCW) for face in tqdm(self.faces): vertices, normals, texture_coords, material = face # print(self.mtl) mtl = self.mtl[material] if 'texture_Kd' in mtl: # use diffuse texmap glBindTexture(GL_TEXTURE_2D, mtl['texture_Kd']) else: # just use diffuse colour glColor(*mtl['Kd']) glBegin(GL_POLYGON) for i in range(len(vertices)): if normals[i] > 0: glNormal3fv(self.normals[normals[i] - 1]) if texture_coords[i] > 0: glTexCoord2fv(self.texcoords[texture_coords[i] - 1]) glVertex3fv(self.vertices[vertices[i] - 1]) glEnd() glDisable(GL_TEXTURE_2D) glEndList()You can use your own model, just need .obj and .mlt file then edit it in the line 33.
In the result in the attack, you can see that the background didn't transparent.
For any help, thank you so much!