PyOpenGL是学习OpenGL编程的好起点吗?

9

我想开始学习OpenGL,但我不想再学一门语言来实现它。我已经相当熟练地掌握了Python并且喜欢这种语言。我只是想知道它跟常规API有多接近?我是否能够轻松地按照教程和书籍进行学习,而不会遇到太多麻烦?

我知道C++能提供更好的性能,但是对于仅仅学习来说,使用PyOpenGL是否可行呢?

2个回答

13

虽然我自己没有太多OpenGL编程经验,但我认为作为学习目的,PyOpenGL是一个不错的选择。主要原因是像大多数其他OpenGL封装包一样,PyOpenGL只是OpenGL API的薄封装。

PyOpenGL的一个很大的好处是,在C语言中你必须担心调用正确的glVertex3{dfiX}命令,而Python允许你只需写glVertex3(x,y,z),而不用担心告诉Python你传递了什么类型的参数。这听起来可能不像什么大不了的问题,但使用Python的鸭子类型通常比过于关注静态类型更简单。

几乎所有的OpenGL方法都被包装成Python方法,因此,虽然你会用Python编写,但你将使用的算法和方法调用与在任何其他语言中编写OpenGL相同。由于你正在使用Python,所以你将有更少的机会犯下"愚蠢的"错误,例如指针使用、内存管理等,如果你要学习C或C++中的API,这些错误将花费你大量时间。


1
对于Java粉丝来说,同样可以这么说JOGL。 - Ricket

0
PyOpenGL
我认为这不是一个好的选择。在我的观点中,使用C/C++更容易玩弄你的OpenGL代码——从简单的应用程序开始,然后添加着色器,再添加一些几何函数,制作纹理/几何生成器,通过CSG构建场景等等。你知道的——为了有趣,玩弄代码,实验和学习过程中的东西。老实说,我真的看不出自己会在Python中做这件事情。当然,在Python中进行OpenGL编程是可能的,但我没有理由去这样做。此外,几个OpenGL函数将内存指针作为参数,虽然可能有一个类(或十几个替代方案)来处理这种情况,但我不认为有必要在C/C++中使用它们,特别是当我考虑到Python代码使用的包装器数量以将这些向量或数组传递到OpenGL函数中时。这只会使事情变得更加复杂,而没有真正的理由这样做。此外,性能下降明显,特别是当你使用“RAW” OpenGL时。
此外,如果你要制作游戏,很可能需要使用C++或其他“非Python”语言。

顺便说一下,我已经做了足够的OpenGL编程和大量的DirectX编程,但我专注于C++,只在某些算法测试、工具和脚本中使用Python。


3
嗨。我给你打了分数低,因为我认为这不是好建议。我想留下评论,解释一下为什么,而不是匿名地离开没有反馈。你说你认为用C++更容易,但没有说为什么。Python代码更短、更简单,需要的参数更少,思考量也更少。 - Jonathan Hartley
1
我花了7年时间编写C和C++代码,但Python的等效版本与C/C++版本完全相同,只是稍微容易创建一些。正如Mark Rushakoff所说,因为没有指针或内存管理问题需要处理,所以Python更容易上手。PyOpenGL会自动将所有OpenGL函数调用包装在默认的参数检查和错误检查中,使诊断更加容易。使用PyOpenGL,您可以将顶点数组作为普通的Python列表传递 - 没有包装器。这会影响性能,但不会增加复杂性问题。 - Jonathan Hartley
2
此外,我认识很多使用Python制作游戏的人。你认为这需要C/C++的假设是基于你认为OpenGL在Python中不好的假设,而这又基于你认为制作游戏必须需要C/C++的假设... :-) - Jonathan Hartley
@JonathanHartley 这个库是否有助于开发人员避免动态类型的问题?比如,防止您因为自动填充而意外地将整数数组填入浮点参数。 - Water
1
@Water。您可以传入几乎任何类型(例如连续的C浮点数组,或Python整数列表等),PyOpenGL会将数字序列静默转换为OpenGL可以使用的内容。这对于入门非常有用,这样您就可以看到一些工作而不必过多地担心类型。(例如,您可能从其他地方获取数组,例如NumPy计算的输出,因此无法控制其类型。)但是稍后,您可以设置一个标志OpenGL.ERROR_ON_COPY来引发错误,而不是执行这些转换。 - Jonathan Hartley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接