近年来,我为OpenLG 2和ES开发了几款小游戏和应用程序。 我现在正尝试在桌面系统上构建基于opengl 3+的场景图,用于休闲“3D”图形。 (没有像虚幻或冷藏引擎那样复杂的事情。)
我开始使用OsX 10.7进行开发,并且对Apples最近的ogl 3.2版本印象深刻,与Windows系统相比,它实现了相同的结果。
否则Linux的结果令人失望。即使是最基本的动画也是口吃,破坏了现实的印象。 windows toolkits freeglut和glfw之间的结果没有区别。 (Extensions加载了glew 1.7)
我想提一下,我说的是新的opengl核心,而不是旧的opengl 2渲染路径,它在Linux下工作正常但是使用cpu代替gpu进行复杂的操作。
在观看像“Unigine heaven demo”这样的专业演示后,我认为在Linux上使用现代实时3D图形存在一般性问题。
非常欢迎任何克服此问题的建议。
更新:
我正在使用: AMD Phenom II X6,Radeon HD57XX配备最新的专有驱动程序(11.8)和Unity(64Bit)。
您可以从工具包文档中获取我的renderloop:
do {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
...
} while (!glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED));
我正在使用 VBOs ,并且所有转换阶段都使用着色器完成。动画计时使用 glfwGetTime()完成。在窗口和全屏模式下会出现此问题。我不知道合成管理器是否会干扰全屏应用程序。但是也不可能要求用户禁用它。
更新2 :
错字:我正在使用HD57XX卡。
GLX_Extension:http://snipt.org/xnKg
PCI转储:01:00.0 VGA compatible controller: ATI Technologies Inc Juniper [Radeon HD 5700 Series]
更新3:
禁用合成管理器减少了,但没有完全消除口吃。 (我用“ubuntu classic without extensions”替换了标准窗口管理器) 一秒钟后,动画会冻结并出现丑陋的扭曲:
(图片已删除 - 不允许发布图片。)
虽然在驱动程序中启用了垂直同步并在应用程序中进行了检查。
答案 0 :(得分:1)
由于您运行Linux,我们需要一些详细信息:
您使用的是哪种硬件?
到目前为止,只有NVidia,AMD / ATI和英特尔提供3D加速。
哪些驱动程序?
对于NVidia和AMD / ATI,有propritary(nvidia-glx,fglrx)和开源驱动程序(nouveau,radeon)。对于英特尔,只有开源驱动程序。
您是否运行合成窗口管理器?
Compositing会产生一大堆同步和时序问题。另外(某些)你可以在某些地方的合成WM中找到的OpenGL代码会让经验丰富的OpenGL编码器眼前一亮,特别是如果有人有编写实时3D(游戏)引擎的经验。
默认情况下,KDE4和GNOME3使用合成(如果可用)。 Ubuntu Unity桌面shell也是如此。此外,对于某些非合成WM,默认skripts启动 xcompmgr 以获得透明度和阴影效果。
最后但同样重要的是:你是如何实现渲染循环的?
经常发现的错误是,计时器用于以“常规”间隔发出重新显示事件。这不是它如何正确完成。定时器事件可以任意延迟,标准定时器也不是很准确。
正确的方法是在紧密循环中调用显示函数并测量渲染迭代之间的时间,然后使用此时间相应地推进动画。一种真正优雅的方法是使用其中一个VSync扩展,提供一个显示刷新频率和刷新计数器。通过这种方式,您可以准确地告知显示刷新周期中帧之间的时间。