如何在Moderngl EGL后端中启用抗锯齿?

问题描述 投票:1回答:1

当没有抗锯齿(samples=0)时,此代码将呈现一个彩色三角形。但是,当我打开抗锯齿(samples=1...32)时,它什么也无法渲染。如何使其具有抗锯齿功能?也许我不能直接从多重采样fbos或纹理中读取像素,但我不知道如何解决。

import numpy as np
from PIL import Image
import moderngl

ctx = moderngl.create_standalone_context(backend='egl')
fbo = ctx.framebuffer(
        color_attachments=ctx.texture((512, 512), 4, samples=2),
        depth_attachment=ctx.depth_texture((512, 512), samples=2)
    )
fbo.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)

image = Image.frombytes('RGBA', (512, 512), fbo.read(components=4))
image = image.transpose(Image.FLIP_TOP_BOTTOM)
image.save('triangle.png', format='png')
python opengl-es egl python-moderngl
1个回答
0
投票

无法直接从多样本帧缓冲区中读取数据。注意,在多样本帧缓冲区中,每个样本的像素都存储在其中。每个样品的颜色必须混合为一种颜色。可以通过glBlitFramebuffer实现。

创建2个帧缓冲区。用glBlitFramebuffer创建一个帧缓冲器,该帧缓冲器用于读取像素数据。创建一个多样本帧缓冲区,它是渲染的目标。

samples=0

将像素数据从多样本帧缓冲区复制到单样本帧缓冲区。我没有找到任何提供该功能的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), ) 类或方法。无论如何,必须绑定多样本帧缓冲区以进行读取,而必须绑定单个样本帧缓冲区以进行写入,并且必须复制颜色数据。在natice OpenGL中,如下所示:

ModernGL

全部:

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

很遗憾,我遇到了一个新问题。如果多样本帧缓冲区也具有深度缓冲区,则无论出于何种原因import numpy as np from PIL import Image import moderngl from OpenGL.GL import * 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) ) 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) glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_msaa.glo) glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo.glo) glBlitFramebuffer(0, 0, 512, 512, 0, 0, 512, 512, GL_COLOR_BUFFER_BIT, GL_LINEAR) image = Image.frombytes('RGBA', (512, 512), fbo.read(components=4)) image = image.transpose(Image.FLIP_TOP_BOTTOM) image.save('c:\\temp\\triangle.png', format='png') 都会失败。这需要进一步调查。

© www.soinside.com 2019 - 2024. All rights reserved.