2016-07-29 62 views
5

我想从OpenGL开始,使用Python和PyGame。如何初始化PyGame而不是GLUT的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: ('Shader compile failure (0): 0:2(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES\n', ['\n #version 330 core\n layout(location = 0) in vec4 position;\n void main()\n {\n gl_Position = position;\n }\n '], GL_VERTEX_SHADER)

我的问题是:我如何用PyGame做这个初始化?

+0

你有没有解决这个问题? – Oly

回答

0

我想这:

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

可能是你在找什么。它演示了如何在pygame和PyOpenGL中使用顶点着色器和片段着色器。如果你不使用PyOpenGL,那么你将不得不。下载它,只需运行:

pip install 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中加载着色器。我相信这是你的主要目标。

+0

这似乎不能解决问题,或者链接的要点。认为我们需要设置pygame的核心配置文件 – Oly