如何在 Moderngl EGL 后端添加深度缓冲区?

2024-06-19

此代码渲染一个带有抗锯齿功能的彩色三角形(samples=8) 当深度缓冲线depth_attachment=ctx.depth_texture((512, 512), samples=8)被评论。

但是当我添加深度缓冲区时,它会在绑定处返回 GL 错误fbo_msaa帧缓冲区到GL_READ_FRAMEBUFFER。你知道如何修复这个错误吗?

import numpy as np
from PIL import Image
import moderngl
import OpenGL.GL as gl

ctx = moderngl.create_standalone_context(backend='egl')

fbo = ctx.framebuffer(
        color_attachments=ctx.texture((512, 512), 4, samples=0)
    )

fbo_msaa = ctx.framebuffer(
        color_attachments=ctx.texture((512, 512), 4, samples=8),
        depth_attachment=ctx.depth_texture((512, 512), samples=8)
    )
fbo_msaa.use()

vertices = np.array([
    -1.0,  -1.0,   1.0, 0.0, 0.0,
     1.0,  -1.0,   0.0, 1.0, 0.0,
     0.0,   1.0,   0.0, 0.0, 1.0],
    dtype='f4',
)

prog = ctx.program(vertex_shader="""
#version 330
in vec2 in_vert;
in vec3 in_color;
out vec3 color;
void main() {
    gl_Position = vec4(in_vert, 0.0, 1.0);
    color = in_color;
}
""",
fragment_shader="""
#version 330
out vec4 fragColor;
in vec3 color;
void main() {
    fragColor = vec4(color, 1.0);
}
""",
)
vao = ctx.simple_vertex_array(prog, ctx.buffer(vertices), 'in_vert', 'in_color')
vao.render(mode=moderngl.TRIANGLES)

gl.glBindFramebuffer(gl.GL_READ_FRAMEBUFFER, fbo_msaa.glo)
gl.glBindFramebuffer(gl.GL_DRAW_FRAMEBUFFER, fbo.glo)
gl.glBlitFramebuffer(0, 0, 512, 512, 0, 0, 512, 512, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR)

image = Image.frombytes('RGBA', (512, 512), fbo.read(components=4))
image = image.transpose(Image.FLIP_TOP_BOTTOM)
image.save('triangle.png', format='png')

GLError                                   Traceback (most recent call last)
<ipython-input-3-b59e4f46148e> in <module>()
     46 vao.render(mode=moderngl.TRIANGLES)
     47 
---> 48 gl.glBindFramebuffer(gl.GL_READ_FRAMEBUFFER, fbo_msaa.glo)
     49 gl.glBindFramebuffer(gl.GL_DRAW_FRAMEBUFFER, fbo.glo)
     50 gl.glBlitFramebuffer(0, 0, 512, 512, 0, 0, 512, 512, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR)

1 frames
/usr/local/lib/python3.6/dist-packages/OpenGL/platform/baseplatform.py in __call__(self, *args, **named)
    413     def __call__( self, *args, **named ):
    414         if self.load():
--> 415             return self( *args, **named )
    416         else:
    417             try:

/usr/local/lib/python3.6/dist-packages/OpenGL/error.py in glCheckError(self, result, baseOperation, cArguments, *args)
    232                         result,
    233                         cArguments = cArguments,
--> 234                         baseOperation = baseOperation,
    235                     )
    236                 return result

GLError: GLError(
    err = 1280,
    description = b'invalid enumerant',
    baseOperation = glBindFramebuffer,
    cArguments = (GL_READ_FRAMEBUFFER, 2)
)

它在使用时起作用渲染缓冲区 https://moderngl.readthedocs.io/en/4.1.2/Renderbuffers.html而不是一个Texture https://moderngl.readthedocs.io/en/4.1.2/Textures.html对于多样本深度缓冲区:

代替

fbo_msaa = ctx.framebuffer(
       color_attachments=ctx.texture((512, 512), 4, samples=8),
       depth_attachment=ctx.depth_texture((512, 512), samples=8)
   )

do

fbo_msaa = ctx.framebuffer(
        color_attachments=ctx.texture((512, 512), 4, samples=8),
        depth_attachment=ctx.depth_renderbuffer((512, 512), samples=8)
    )

这似乎是一个错误ModernGL https://moderngl.readthedocs.io/en/4.1.2/Textures.html,与多重采样纹理深度缓冲区附件相关。
此外,错误 1280 (GL_INVALID_ENUM) 没有任何意义,GL_READ_FRAMEBUFFER是一个有效的论点glBindFramebuffer https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindFramebuffer.xhtml.

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

如何在 Moderngl EGL 后端添加深度缓冲区? 的相关文章

随机推荐

  • 如何设置 tmux 在启动时打开指定的窗口?

    如何设置 tmux 使其在启动时打开指定的窗口 您可以编写一个小 shell 脚本来启动 tmux 以及所需的程序 我在一个名为 dev tmux 的 shell 脚本中包含以下内容 开发环境 bin sh tmux new session
  • 检测输入何时具有“只读”属性

    我想在输入具有 只读 属性时发出警报 我已经尝试过这个 if input attr readonly readonly alert foo 我认为 如果 甚至不是最好的方法 最快的方法是使用 is jQuery 函数 if input is
  • 使用 include 的 Javascript 过滤对象

    我正在尝试使用 javascript 中的 filter 函数来过滤对象 我想过滤这样的数组 1615 1616 它在代码中被引用为 value verdier 数据集是一个大型数组 包含从 JSON 字符串解析的具有多个属性的对象 数组中
  • 将箱线图添加到Python中的其他图表中

    这两个图的每个点的 x 轴值完全相同 是否可以在第一个图的顶部显示盒须 我试过这个 fig1 plt figure ax fig1 add subplot 211 ax set xscale log ax plot x7 y7 c ax p
  • 正则表达式将从文本文件中提取句子

    我需要一个正则表达式来从文本文件中提取句子 示例文本 以 2004 年底发生的亚洲海啸灾难为例 对 Google 新闻 http news google com 的查询在一个月内 1 月 17 日 返回了超过 80 000 篇有关该事件的在
  • 如何发布数组多维角度js

    我在 angularjs 中有一个数组 示例如下 scope order qty 20 scope order adress Bekasi scope order city Bekasi 这个数组可以用这个代码发布 http method
  • x86 asm 的 NASM 语法中的括号是什么意思?

    给出以下代码 L1 db word 0 mov al L1 mov eax L1 括号里是什么意思 L1 代表 这个问题专门针对 NASM Intel 语法汇编的另一个主要风格是 MASM 风格 当不涉及寄存器时 括号的工作方式有所不同 S
  • artisan 明确编译返回错误代码 255

    跑步时composer install在我的 laravel 项目中 我收到错误 脚本 php artisan 清晰编译处理返回的 post install cmd 事件 错误代码为 255 关于可能出现的问题有什么建议吗 请注意 comp
  • 如何在不下载内容的情况下执行 GET 请求?

    我正在开发一个链接检查器 一般来说我可以执行HEAD请求 但是有些网站似乎禁用了这个动词 所以在失败时我还需要执行GET请求 仔细检查链接是否确实已失效 我使用以下代码作为我的链接测试器 public class ValidateResul
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 如何在缩进层次结构中找到父级?

    我目前有一张 Excel 工作表 其中包含缩进的项目层次结构 如下所示 每个项目都缩进 每个缩进四个空格 以显示它如何适应整体层次结构 我已经能够创建一个 级别 列 将缩进级别转换为数字 Item Level Parent P1 1 N A
  • Azure Functions 无法与队列触发器一起使用

    预先感谢任何可以提供帮助的人 我正在使用队列触发器在 Azure 中创建以下函数 FunctionName SubmitJob public static async Task Run ServiceBusTrigger jobs Conn
  • Bundle exec rspec VS rspec 规范

    红宝石 1 9 2 导轨 3 1 这是问题所在bundle exec rspec spec 不起作用 但是rspec spec 运行正常 当我跑步时c RailsInstaller work apptwit gt bundle exec r
  • 在 main 之前执行任何函数[重复]

    这个问题在这里已经有答案了 我想在 main 之前执行用户定义函数 是否可以先执行一个函数main in c sum int a int b return a b g sum sum 1 5 main sum 5 6 printf d g
  • 将变量设置为函数调用以在 PHP 中的 if 语句中使用

    好的 我正在做一些 Wordpress 编辑 并且编写了一个 if 语句 正如您所看到的 这使用函数调用作为变量 这是因为函数调用会调用当前页面的名称 这很好 然而 当我这样做时 它也往往会与页面上的标题相呼应 这是有道理的 我可能正在尝试
  • 如何使用“index_mut”来获取可变引用?

    即使当我实施IndexMut对于我的结构 我无法获得对结构内部向量元素的可变引用 use std ops Index IndexMut struct Test
  • 模板策略模式

    我想分解一个类 使其与执行某些任务的逻辑分离 以便用户可以按照自己的意愿编写新策略 而不会干扰中心模型 因此 我想使用模板化策略类 但不必让策略的用户被模板化 class Model boost shared ptr lt Strategy
  • 如何覆盖flask-security的登录?

    我想在用户登录时进行一些自定义 问题是该项目正在使用flask security 它隐式处理用户登录 我想在用户登录时检查数据库中用户的一些记录 如何覆盖烧瓶安全中的 登录 功能 I saw a 类似的帖子 https stackoverf
  • 从子域重定向到域+ .htaccess

    我可以为多个域配置 RewriteRule 吗 就像我的要求是 我当前的域名 www maindomain com 假设我有三个域和子域 子域网址是 example1 maindomain com example2 maindomain c
  • 如何在 Moderngl EGL 后端添加深度缓冲区?

    此代码渲染一个带有抗锯齿功能的彩色三角形 samples 8 当深度缓冲线depth attachment ctx depth texture 512 512 samples 8 被评论 但是当我添加深度缓冲区时 它会在绑定处返回 GL 错