OpenGL 中的透明 FrameBuffer 背景

2024-01-01

我想使用 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”作为帧缓冲区的渲染目标。换句话说,您实质上是在说“当我绘制到此帧缓冲区时,绘制到此纹理中。”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 中的透明 FrameBuffer 背景 的相关文章

随机推荐

  • React-navigation 在调试模式下工作正常,但在发布模式下不行

    几周以来我遇到了一个问题 我在我的react native应用程序中使用react navigation 当我在调试模式下在我的设备上测试时 我在屏幕之间正确导航 但是当我构建签名的apk时 导航不再工作 我尝试了一切 但没有任何效果 我正
  • 在已知缺失时间间隔之间插入 3D 坐标

    数据是空间中的路径 我有 3D 位置数据 x y z 和记录位置点的时间 x y 和 z 坐标是物体在 3D 空间中移动的点位置 时间值是记录每个点的时间 从 0 开始 x y z time s 0 1 2 2 3 3 0 2 4 2 4
  • 为什么不在java中使用带有锁的try?

    我读了这个话题 https stackoverflow com questions 6965731 are locks autocloseable 和这个博客文章 http www java7developer com blog p 256
  • 编译时出现错误?

    当我编译代码时 我收到这些错误 我有 user include 下的所有标题 g Ip appmanager inc Icore inc p appmanager src appmanager process cpp o p appmana
  • 本地主机上的 404 错误

    我正在尝试使用一些ajax 来发送一些电子邮件 我在使用冷聚变之前已经这样做过并且没有任何问题 我遇到的是本地主机未在目录中找到明确的文件 事实上 该文件与index php 位于同一目录中 这没有发现任何问题 然而它给了我一个404错误找
  • 使用 LiveData、协程和事务测试 Android Room

    我想测试我的数据库层 但我陷入了第 22 条军规类型的情况 测试用例由两部分组成 保存一些实体 加载实体并断言数据库映射按预期工作 简而言之 问题在于 Insert is a suspend方法 这意味着它需要运行在runBlocking
  • Eclipse“正确缩进”忽略空格与制表符设置

    我正在 Windows 中运行 Eclipse Juno Service Release 2 20130225 0426 我发现自动缩进 Ctrl I 会忽略常规 编辑器 文本编辑器 插入选项卡空格和 Java 代码样式 格式化程序 缩进
  • “无处不在”使用 LINQ 时的性能问题?

    升级到 ReSharper5 后 它为我提供了更多关于代码改进的有用提示 我现在随处看到的一个提示是用 LINQ 查询替换 foreach 语句 举个例子 private Ninja FindNinjaById int ninjaId fo
  • 获取 Android 上的应用程序安装日期

    有没有办法找出 Android 设备上的 应用程序安装日期 进行了大量搜索 但无法找到相关答案 无法找到有关应用程序安装日期的任何信息PackageManager文档 代码 或这个 API 级别 9向上 long installed con
  • Z Shell“自动加载”内置 - 它有什么好处?

    我已经使用 Z shell 一段时间了 我开始感到好奇 我在编写自己的函数时偶然发现的一件事是 自动加载 根据 zshbuiltins 1 手册页autoload是 相当于functions u 有一个例外 它 相当于typeset f 有
  • Webkit 必须始终在主线程上使用吗?

    我试图在后台渲染网页 但遇到了以下麻烦 2012 05 11 12 39 02 086 77207 1c03 An uncaught exception was raised 2012 05 11 12 39 02 087 77207 1c
  • 在从代码库中的 dockerfile 构建的 Docker 容器中运行 Jenkins 测试

    我想部署一个基于Jenkins的持续集成平台 由于我有各种类型的项目 PHP Symfony node Angular 等 并且我希望这些测试既可以在本地运行 也可以在 Jenkins 上运行 所以我正在考虑使用 Docker 容器 我的目
  • 数据库内部结构 - 从哪里开始? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 假设您想了解一些有关数据库内部结构的知识 最好看的源代码是什么 最好买的书 前几天我和一个朋友讨论这个问
  • 构建 Qt5 Git / Perl - 路径

    我的理解能力有点问题 In the Qt Wiki http qt project org wiki Building Qt 5 from Git aea23489ce3aa9b6406ebb28e0cda430上面写着我必须 Hint 确
  • 如何将 Delphi 调试器附加到 64 位 IIS 7.5?

    我在 Windows 7 Pro 64 和 IIS 7 5 上运行 Delphi XE 开发 ISAPI 应用程序 IIS 配置正确 包括允许 32 位代码在 ISAPI 进程中运行 ISAPI进程运行正常 在 Delphi 中 我尝试附加
  • Chrome Inspect - 关闭预览框架

    在 Chrome 的最新更新中 检查 窗口 chrome inspect 有一个预览窗口 在屏幕移动框架中显示网页 我该如何关闭它 到目前为止 我所做的最接近的事情是减少宽度 这样它就不会占用太多的屏幕空间 图片示例 您可以使用下面突出显示
  • Docker 镜像 - 类型。修身 vs 修身弹力 vs 弹力 vs 高山

    我正在寻找一个 docker 镜像来构建一个 java 应用程序 并查看可用的 OpenJDK 镜像的变体 我正在看这里https github com docker library openjdk tree master 8 jdk ht
  • 如何正确地使JSP会话失效?

    所以问题就在这里 当用户退出我的网站时 他们仍然可以点击后退按钮并继续使用该网站 为了跟踪用户是否登录 我创建了一个会话属性 isActive 该属性在用户登录时设置为 true 并在注销时会话失效之前被 冗余 删除 另外 我在每个页面上检
  • 如何替换 Web API 模型绑定的行为,以便在没有传入参数时收到一个新实例而不是 Null

    我们有一个包含许多操作的 API 这些操作需要Filter目的 但是 当有人调用 API 方法并且不传递任何参数时 我们最终会得到空引用 为了避免在任何地方都必须检查这一点 我们希望改变模型绑定的行为 以便对于该类型它返回一个新实例而不是
  • OpenGL 中的透明 FrameBuffer 背景

    我想使用 glClear 和 glClearColor 用包括 alpha 透明度的颜色填充帧缓冲区 但是 当绑定到渲染到屏幕的纹理时 帧缓冲区始终呈现为不透明 我希望渲染到帧缓冲区的所有内容都保持其透明度 我只是想改变背景 请看下面的代码