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

Python 如何在Moderngl EGL后端添加深度缓冲区?,python,opengl,opengl-es,egl,python-moderngl,Python,Opengl,Opengl Es,Egl,Python Moderngl,当对深度缓冲线depth\u attachment=ctx.depth\u纹理((512,512),samples=8)进行注释时,此代码使用抗锯齿(samples=8)渲染彩色三角形 但是,当我添加深度缓冲区时,它会在绑定到GL\u READ\u framebuffer时返回一个GL错误。您知道如何修复此错误吗 import numpy as np from PIL import Image import moderngl import OpenGL.GL as gl ctx = moder

当对深度缓冲线
depth\u attachment=ctx.depth\u纹理((512,512),samples=8)
进行注释时,此代码使用抗锯齿(
samples=8
)渲染彩色三角形

但是,当我添加深度缓冲区时,它会在绑定到
GL\u READ\u framebuffer
时返回一个GL错误。您知道如何修复此错误吗

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)
)
将numpy导入为np
从PIL导入图像
进口现代化
将OpenGL.GL作为GL导入
ctx=moderngl.create_standalone_上下文(backend='egl')
fbo=ctx.framebuffer(
颜色附件=ctx.texture((512),4,样本=0)
)
fbo_msaa=ctx.framebuffer(
颜色=ctx.纹理((512),4,样本=8),
深度\附着=ctx。深度\纹理((512,512),样本=8)
)
fbo_msaa.use()
顶点=np.数组([
-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(顶点着色器=”“”
#330版
在vec2的垂直方向;
在vec3中以_色显示;
输出vec3颜色;
void main(){
gl_位置=vec4(垂直,0.0,1.0);
颜色=彩色;
}
""",
片段_着色器=“”
#330版
out vec4 fragColor;
vec3颜色;
void main(){
fragColor=vec4(颜色,1.0);
}
""",
)
vao=ctx.simple\u vertex\u数组(prog,ctx.buffer(顶点),“in\u vert”,“in\u color”)
vao.render(模式=现代化三角形)
gl.glBindFramebuffer(gl.gl_READ_FRAMEBUFFER,fbo_msaa.glo)
gl.glBindFramebuffer(gl.gl\u DRAW\u FRAMEBUFFER,fbo.glo)
gl.glBlitFramebuffer(0,0,512,512,0,0,512,512,gl.gl\u颜色缓冲\u位,gl.gl\u线性)
image=image.frombytes('RGBA',(512),fbo.read(components=4))
image=image.transpose(image.FLIP\u TOP\u BOTTOM)
image.save('triangle.png',format='png')
GLError回溯(最近一次呼叫上次)
在()
46 vao.渲染(模式=现代化三角形)
47
--->48 gl.glBindFramebuffer(gl.gl_READ_FRAMEBUFFER,fbo_msaa.glo)
49 gl.glBindFramebuffer(gl.gl\u DRAW\u FRAMEBUFFER,fbo.glo)
50 gl.glBlitFramebuffer(0,0,512,512,0,0,512,512,gl.gl\u颜色缓冲\u位,gl.gl\u线性)
1帧
/usr/local/lib/python3.6/dist-packages/OpenGL/platform/baseplatform.py in __调用(self,*args,**命名)
413定义调用(self,*args,**命名):
414如果self.load():
-->415返回自我(*参数,**命名)
416其他:
417试试:
/glCheckError中的usr/local/lib/python3.6/dist-packages/OpenGL/error.py(self、result、baseOperation、cArguments、*args)
232结果,
233 cArguments=cArguments,
-->234基本操作=基本操作,
235                     )
236返回结果
格雷罗:格雷罗(
err=1280,
description=b“无效枚举器”,
baseOperation=glBindFramebuffer,
cArguments=(GL\u READ\u帧缓冲区,2)
)
在多采样深度缓冲区中使用a而不是a时,它会起作用:

而不是

fbo_msaa=ctx.framebuffer(
颜色=ctx.纹理((512),4,样本=8),
深度\附着=ctx。深度\纹理((512,512),样本=8)
)

fbo_msaa=ctx.framebuffer(
颜色=ctx.纹理((512),4,样本=8),
depth\u attachment=ctx.depth\u renderbuffer((512,512),samples=8)
)
这可能是一个bug,与多样本纹理深度缓冲区连接有关。
此外,错误1280(
GL\u INVALID\u ENUM
)没有任何意义,
GL\u READ\u FRAMEBUFFER
是的有效参数