【问题标题】:How to initialize OpenGL context with PyGame instead of GLUT如何使用 PyGame 而不是 GLUT 初始化 OpenGL 上下文
【发布时间】:2016-12-04 12:15:25
【问题描述】:

我正在尝试从 OpenGL 开始,使用 Python 和 PyGame。

我将使用 PyGame 而不是 GLUT 来完成所有初始化、窗口打开、输入处理等。

但是,除非我准确指定 OpenGL 和配置文件的版本,否则我的着色器无法编译。

他们确实使用书中的 GLUT 初始化进行编译:

glutInit()
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(400, 400)

# this is what I need
glutInitContextVersion(3, 3)
glutInitContextProfile(GLUT_CORE_PROFILE)

glutCreateWindow("main")

但是,像这样简单的 PyGame 初始化:

pygame.init()
display = (400, 400)
pygame.display.set_mode(display, pygame.DOUBLEBUF|pygame.OPENGL)

未指定确切的 OpenGL 版本 3.3 和 CORE_PROFILE, 尝试编译着色器时,相同的程序会失败:

RuntimeError: ('着色器编译失败 (0): 0:2(10): error: GLSL 3.30 不支持。支持的版本有:1.10、1.20、1.30、1.00 ES、 和 3.00 ES\n', ['\n #version 330 core\n layout(location = 0) in vec4 位置;\n void main()\n {\n gl_Position = 位置;\n }\n '], GL_VERTEX_SHADER)

我的问题是:如何使用 PyGame 进行初始化?

【问题讨论】:

  • 你解决过这个问题吗?

标签: python opengl pygame glut pyopengl


【解决方案1】:

问题在于 pygame 正在初始化一个不够现代的 OpenGL 上下文,或者您获得的是“兼容性”OpenGL 配置文件而不是“核心”OpenGL 配置文件。

这实际上是 pygame 本身的一个问题,我提交了一个关于它的错误。 pygame 的人正在通过添加适当的函数来获取 OpenGL 属性来修复它。如果你需要解决它,你可以使用 ctypes 深入到 SDL 层并设置 OpenGL 属性。

在这里讨论、临时解决方案和功能添加:

https://github.com/pygame/pygame/issues/1124#issuecomment-507021897

https://github.com/pygame/pygame/pull/1127

【讨论】:

    【解决方案2】:

    我认为:

    https://gist.github.com/MorganBorman/4243336

    可能是您正在寻找的。它展示了如何在 pygame 和 PyOpenGL 中使用顶点着色器和片段着色器。如果您不使用 PyOpenGL,那么您将不得不这样做。要下载它,只需运行:

    点安装 PyOpenGL

    在您的命令提示符/终端中

    如果这不起作用,我建议查看 PyOpenGL 安装页面了解更多详细信息:

    http://pyopengl.sourceforge.net/documentation/installation.html

    我提供了一个简短的示例,说明我认为您尝试使用链接中的一些代码进行的操作。

    import OpenGL.GL as GL
    import OpenGL.GL.shaders
    import pygame as pg
    
    
    #-------------not my code, credit to: Morgan Borman--------------#
    vertex_shader = """
    #version 330
    in vec4 position;
    void main()
    {
       gl_Position = position;
    }
    """
    
    fragment_shader = """
    #version 330
    void main()
    {
       gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
    }
    """
    #----------------------------------------------------------------#
    
    def main():
        pg.init()
    
        #-------------not my code, credit to: Morgan Borman--------------#
        GL.glClearColor(0.5, 0.5, 0.5, 1.0)
        GL.glEnable(GL.GL_DEPTH_TEST)
    
        shader = OpenGL.GL.shaders.compileProgram(
            OpenGL.GL.shaders.compileShader(vertex_shader, GL.GL_VERTEX_SHADER),
            OpenGL.GL.shaders.compileShader(fragment_shader, GL.GL_FRAGMENT_SHADER)
        )
        #----------------------------------------------------------------#
    
        DISPLAY_DIMENSIONS = (640, 480)
        display = pg.display.set_mode(DISPLAY_DIMENSIONS, pg.DOUBLEBUF | pg.OPENGL)
        clock = pg.time.Clock()
        FPS = 60
    
        while True:
            clock.tick(FPS)
            for e in pg.event.get():
                if e.type == pg.QUIT:
                    return
    
    
            pg.display.flip()
    
    if __name__ == '__main__':
        try:
            main()
        finally:
            pg.quit()
    

    它除了在 pygame 中加载着色器之外什么都不做。我相信这是你的主要目标。

    【讨论】:

    • 这似乎并没有解决问题,或者链接的要点。认为我们需要为 pygame 设置一些核心配置文件
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2013-05-26
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多