2016-07-29 10 views
5

Я пытаюсь начать с OpenGL, используя Python и PyGame.Как инициализировать контекст OpenGL с помощью PyGame вместо GLUT

Я собираюсь использовать 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