izh*_*hak 6 python opengl glut pygame 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")
Run Code Online (Sandbox Code Playgroud)
但是,像这样简单的PyGame初始化:
pygame.init()
display = (400, 400)
pygame.display.set_mode(display, pygame.DOUBLEBUF|pygame.OPENGL)
Run Code Online (Sandbox Code Playgroud)
它没有指定确切的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 core \n vec4位置的布局(位置= 0); \n void main()\n {\n \n <br_Position = position; \n} \n'],GL_VERTEX_SHADER)
我的问题是:如何使用PyGame进行初始化?
我认为这:
可能就是您所寻找的。它展示了如何在 pygame 和 PyOpenGL 中使用顶点着色器和片段着色器。如果你不使用 PyOpenGL,那么你就必须使用。要下载它,只需运行:
pip 安装 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()
Run Code Online (Sandbox Code Playgroud)
它除了在 pygame 中加载着色器之外不执行任何操作。我相信这是你的主要目标。
| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |