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

时间:2016-07-29 17:38:59

标签: python opengl pygame glut pyopengl

我正在尝试使用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核心\ n布局(位置= 0)in   vec4 position; \ n void main()\ n {\ n \ n

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我想这个:

  

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

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

  

pip install PyOpenGL

在命令提示符/ terminal

如果这不起作用,我建议您查看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中加载着色器之外,它什么也没做。我相信这是你的主要目标。