python framebuffer_关于python:OpenGL中的透明FrameBuffer背景

我想使用glClear和glClearColor用包括Alpha透明度的颜色填充帧缓冲区。 但是,当帧缓冲区绑定到渲染到屏幕的纹理时,它始终呈现为不透明。

我希望渲染到帧缓冲区的所有内容保持其透明度。 我只想更改背景。

请参见以下代码:

def create_texture(surface):

surface.texture = glGenTextures(1)

glMatrixMode(GL_MODELVIEW)

glLoadIdentity() #Loads model matrix

glBindTexture(GL_TEXTURE_2D, surface.texture) #Binds the current 2D texture to the texture to be drawn

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) #Required to be set for maping the pixel data

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) #Similar as above

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface.surface_size[0], surface.surface_size[1], 0, GL_RGBA,GL_UNSIGNED_BYTE, surface.data) #Put surface pixel data into texture

if surface.data == None:

setup_framebuffer(surface)

c = [float(sc)/255.0 for sc in surface.colour] #Divide colours by 255 because OpenGL uses 0-1

if surface.background_alpha:

c[3] = float(surface.background_alpha)/255.0

glClearColor(*c)

glClear(GL_COLOR_BUFFER_BIT)

end_framebuffer()

Surface.texture_ready.append(surface)

def setup_framebuffer(surface):

#Create texture if not done already

if surface.texture == None:

create_texture(surface)

#Render child to parent

if surface.frame_buffer == None:

surface.frame_buffer =  glGenFramebuffersEXT(1)

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface.frame_buffer)

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0)

glPushAttrib(GL_VIEWPORT_BIT)

glViewport(0,0,surface._scale[0],surface._scale[1])

glMatrixMode(GL_PROJECTION)

glLoadIdentity() #Load the projection matrix

gluOrtho2D(0,surface._scale[0],0,surface._scale[1])

def end_framebuffer():

glPopAttrib()

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)

glMatrixMode(GL_PROJECTION)

glLoadIdentity() #Load the projection matrix

gluOrtho2D(0,1280,720,0) #Set an orthorgraphic view

surface.background_alpha应该是帧缓冲区背景的透明度。 这是我的初始化代码:

def __init__(self,title,game_size,on_exit = sys.exit):

self.keys = [False] * 323

self.events = []

pygame.font.init()

pygame.mixer.init()

self.title = title

self.game_size = game_size

self.first_screen = (1280,720) #Take 120 pixels from the height because the menu bar, window bar and dock takes space

glutInit(sys.argv)

glutInitWindowPosition(0,0)

glutInitWindowSize(*game_size)

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)

glutGameModeString("1280x720:32@60") #720 HD

glutCreateWindow(title)

glutSetIconTitle(title)

self.callbacks()

self.game_gap = (0,0)

self.on_exit = on_exit

self.mod_key = 1024 if sys.platform =="darwin" else 64

Surface.__init__(self,game_size)

self.screen_change = True

self.frames = [time.time()]

self.fps = 60

self.last_time = 0

self.fade_surface = Surface([1280,720])

def callbacks(self):

glutReshapeFunc(self.reshaped)

glutKeyboardFunc(self.keydown)

glutKeyboardUpFunc(self.keyup)

glutSpecialFunc(self.specialdown)

glutSpecialUpFunc(self.specialup)

glutDisplayFunc(self.game_loop)

glutIdleFunc(self.game_loop)

glutMouseFunc(self.mouse_func)

glutPassiveMotionFunc(self.mouse_move)

glViewport(0,0,self.first_screen[0],self.first_screen[1]) #Creates the viewport which is mapped to the window

glEnable(GL_BLEND) #Enable alpha blending

glEnable(GL_TEXTURE_2D) #Enable 2D Textures

glEnable(GL_POLYGON_SMOOTH) #Enable antialiased polygons

glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)

glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

glMatrixMode(GL_PROJECTION)

glLoadIdentity() #Load the projection matrix

gluOrtho2D(0,1280,720,0) #Set an orthorgraphic view

该代码有点混乱,因为我进行了大量调整以使工作正常进行,并且我没有适当整理所有内容。

如果有人可以帮助我,我非常感谢。

我认为这里对帧缓冲区有一个基本的误解。帧缓冲区本身并不是真正的数据缓冲区,它不保存任何数据。您可以在其上附加缓冲区(如纹理),以便可以以绘制到屏幕上的相同方式渲染到屏幕外缓冲区。因此,当您说要" glClear和glClearColor用包括Alpha透明度的颜色填充帧缓冲区"时,这没有任何意义,因为帧缓冲区本身不保存任何颜色数据。

通过此调用将纹理附加到帧缓冲区时:

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0)

您正在使" surface.texture"成为帧缓冲区的渲染目标。换句话说,您实际上是在说"当我绘制到该帧缓冲区时,请绘制到该纹理中"。

此时,对glClear的调用应该可以正常工作。

如果要使帧缓冲区透明,以便可以在桌面上渲染对象,则必须知道通过Glut无法做到这一点。

这种效果特定于您使用的平台。它是什么? Linux的?视窗? Mac OS X?您将不得不动手(将Glut排除在方程式之外),并进一步了解有关构建窗户的知识。

顺便说一句,如果您的目标是Windows,则应检查以下内容:

(win32)如何制作具有透明背景的OpenGL渲染上下文?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值