首页 文章

如何使用PyGame而不是GLUT初始化OpenGL上下文

提问于
浏览
6

我正在尝试使用Python和PyGame开始使用OpenGL .

我将使用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):错误:不支持GLSL 3.30 . 支持的版本是:1.10,1.20,1.30,1.00 ES和3.00 ES \ n',['\ n #version 330 core \ n在vec4位置布局(位置= 0); \ n void main()\ n {\ n \ nn \ _ <br_Position = position; \ n} \ n'],GL_VERTEX_SHADER)

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

1 回答

  • 0

    我认为这:

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

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

    pip安装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中加载着色器之外,它什么都不做 . 我相信这是你的主要目标 .

相关问题