2016-07-29 21 views
5

Tôi đang cố bắt đầu với OpenGL, sử dụng Python và PyGame.Cách khởi tạo ngữ cảnh OpenGL với PyGame thay vì GLUT

Tôi sẽ sử dụng pygame thay vì thị trường bất động để làm tất cả những Khởi tạo, cửa sổ mở, xử lý đầu vào vv

Tuy nhiên, shaders tôi đang thất bại trong việc biên dịch, trừ khi tôi xác định chính xác phiên bản của OpenGL và Hồ sơ.

Họ làm biên dịch với thị trường bất động khởi tạo từ cuốn sách:

glutInit() 
glutInitDisplayMode(GLUT_RGBA) 
glutInitWindowSize(400, 400) 

# this is what I need 
glutInitContextVersion(3, 3) 
glutInitContextProfile(GLUT_CORE_PROFILE) 

glutCreateWindow("main") 

Nhưng, với khởi Pygame đơn giản như thế này:

pygame.init() 
display = (400, 400) 
pygame.display.set_mode(display, pygame.DOUBLEBUF|pygame.OPENGL) 

mà không xác định chính xác phiên bản OpenGL 3.3 và CORE_PROFILE , cùng một chương trình sẽ thất bại khi cố gắng biên dịch bóng đổ:

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)

Câu hỏi của tôi là: làm cách nào để thực hiện việc khởi tạo này với PyGame?

+0

Bạn đã bao giờ giải quyết vấn đề này chưa? – Oly

Trả lời

0

Tôi nghĩ rằng đây:

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

có thể là những gì bạn đang tìm kiếm. Nó cho thấy làm thế nào để sử dụng shader vertex và shaders fragment trong pygame và PyOpenGL. Nếu bạn không sử dụng PyOpenGL, thì bạn sẽ phải làm vậy. Để tải về nó, chỉ cần chạy:

pip install PyOpenGL

tại dấu nhắc lệnh của bạn/terminal

Nếu điều đó không làm việc, tôi khuyên bạn nên tham gia một cái nhìn tại các trang cài đặt PyOpenGL để biết thêm chi tiết:

http://pyopengl.sourceforge.net/documentation/installation.html

Tôi bao gồm một ví dụ ngắn luộc xuống của những gì tôi nghĩ rằng bạn đang cố gắng để làm bằng cách sử dụng một số mã từ liên kết.

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() 

Nó không làm gì ngoài tải bóng đổ trong pygame. Mà tôi tin là mục tiêu chính của bạn.

+0

Điều này dường như không giải quyết được vấn đề, hoặc thực hiện liên kết. Hãy nghĩ rằng chúng ta cần phải thiết lập hồ sơ cốt lõi một số làm thế nào cho pygame – Oly

Các vấn đề liên quan