1 前言
最近Genesis
实在太火爆了,毕竟在仿真领域UE
目前是大哥中的大哥,突然出了一个新的引擎,不仅效果甚至比UE
的效果还要好,而且速度还比UE
快的多,还是Python
开发的,那上手难度一下降下来了,引的一片人围观。我也迫不及待的试了一下,结果连第一个Hello World
都没有跑过去,报错function 'glGetUniformLocation' not found
。经过一天的排查,最终也找到了原因,在此记录一下。友情提示一下,很坑。
2 Hello Genesis
按照代码届的惯例,拿到任何一个框架,第一步就是写个Hello World
出来。因此我们参考官方的中文文档
https://genesis-world.readthedocs.io/zh-cn/latest/user_guide/getting_started/hello_genesis.html
import genesis as gs
gs.init(backend=gs.gpu,theme='light')scene = gs.Scene(show_viewer=True)
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)scene.build()for i in range(1000):scene.step()
结果意外的拿到了错误信息:
AttributeError: function 'glGetUniformLocation' not found
3 安装OpenGL环境
glGetUniformLocation
不就是OpenGL
里的函数吗?因此我首先想到的就是难道OpenGL
的环境有问题?于是打开conda
的控制台,输入以下命令安装OpenGL
环境
pip install PyOpenGL PyOpenGL_accelerate
等待安装完毕后,回到pycharm
里看下包的情况
可以看到已经安装成功了,但是错误仍然在。
4 Python解释器启用NVIDIA独立显卡支持
首先我们通过一段代码来检测一下我们程序里调用的到底是集成显卡还是独立显卡,新建一个test.py
import glfw
from OpenGL.GL import *
import sysif not glfw.init():print("Failed to initialize GLFW!")sys.exit(-1)# 创建一个 OpenGL 窗口上下文
glfw.window_hint(glfw.VISIBLE, glfw.FALSE) # 隐藏窗口
window = glfw.create_window(640, 480, "Test", None, None)
if not window:print("Failed to create GLFW window!")glfw.terminate()sys.exit(-1)glfw.make_context_current(window)# 现在可以测试调用 OpenGL 函数了
print("OpenGL Version:", glGetString(GL_VERSION).decode())
输出:
OpenGL Version: 4.6.0 - Build 31.0.101.4502
说明OpenGL
环境没问题了,但是调用的是集显,后面的Build 31.0.101.4502
就是集显的版本号,英伟达的应该是NVIDIA xxx
才对。因此我们现在需要进行两处配置:
4.1 系统设置
win11设置 - 系统 - 屏幕 - 显示卡 - Python解释器 - 高性能
4.2 英伟达显卡设置
5 验证Python是否启用了NVIDIA独立显卡
还是执行test.py
,这次输出变了
import glfw
from OpenGL.GL import *
import sysif not glfw.init():print("Failed to initialize GLFW!")sys.exit(-1)# 创建一个 OpenGL 窗口上下文
glfw.window_hint(glfw.VISIBLE, glfw.FALSE) # 隐藏窗口
window = glfw.create_window(640, 480, "Test", None, None)
if not window:print("Failed to create GLFW window!")glfw.terminate()sys.exit(-1)glfw.make_context_current(window)# 现在可以测试调用 OpenGL 函数了
print("OpenGL Version:", glGetString(GL_VERSION).decode())
输出:
OpenGL Version: 4.6.0 NVIDIA 566.36
OK,这下应该可以了吧。再次执行Hello Genisis
,还是function 'glGetUniformLocation' not found。
fuck!
6 查官方文档
在安装篇的说明文档中看到这么一张图:
are you kidding me?windows
上还不支持交互式查看器和无头渲染,什么意思?OpenGL
不就是做渲染的么?也就是说目前确实不支持在windows
上渲染,也就是看不到官方视屏里那个渲染界面呗,也就是下面这个界面,这不纯瞎耽误功夫呢吗?希望官方尽快支持windows
吧。毕竟用linux
虚拟机来跑这个库还是有点不太现实。
那么是否意味着,只要不启动界面,就不会遇到这个问题?那么我们来跑下官方示例中的parallel_simulation.py
,即并行仿真,因为这个例子没有启动渲染界面,看看还会不会报错
这次果然顺利的执行完了,没有报错。
7 总结
本文详细的梳理了windows
上Genesis
框架遇到function 'glGetUniformLocation' not found
问题的解决方案,本着排查问题、分析问题、解决问题的思路,从项目环境到系统设置再到显卡设置,全部排查完毕之后没有问题,最后来到官方文档,果然发现了问题。怎么有点像我是刑警里的破案呢?排除了所有的不可能,剩下的就是真相。最近看我是刑警真有点着魔了。好吧,还是希望官方加油赶紧支持windows
吧。顺道提一句,UE
是一个集成的渲染平台,UE4.26
之前仿真引擎都用的是英伟达开发的PhysX
作为物理引擎,UE4.26
开始换成了团队自己研发的Chaos
物理引擎。Genesis
团队如果要是不想自己做windows
渲染平台,是否可以交给UE渲染?