2016-07-29 169 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