我期待一个类似于 Windows API 的 Linux API。我在 Google 上看到的只是对 Qt 和 GTK 的引用。我真的只需要一个简单的窗口就可以使用 OpenGL 进行绘制,所以这些库对于我的使用来说显得臃肿。Qt 和 GTK 在 Linux 下使用什么来创建窗口?没有比这更底层的了吗?
6 回答
X 窗口系统通常进行绘图 - 然后您在原始 Xlib 之上使用 Qt 或 GTK 等工具包来提供事件循环、拖放、鼠标点击启动应用程序以及所有其他“桌面”内容
直接使用Xlib 和 opengl相当容易,或者如果您只想学习 opengl,glut提供了显示窗口、处理鼠标/键盘事件等所需的框架。
对于 OpenGL,最简单的方法是使用GLUT或SDL。这是一个使用 GLUT 的近似示例:
#include <GL/glut.h>
int main (int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("My new window");
/* ... */
}
你真的想避免直接使用 Xlib,因为它使用起来非常乏味。此外,GLUT 和 SDL 可以更轻松地将 OpenGL 应用程序移植到不同的平台。
Ax Martin 说,X11(或者现在它的分支 XOrg)是窗口系统,但实际上你可以不使用工具包,只使用 X 库来编写 X11 应用程序(即客户端)。有关文档,请参见 此处。
这样做通常不是最好的主意,因为它相当痛苦,并且会涉及大量代码,以使相对简单的应用程序按您期望的方式工作。
更新了 2019 年的答案。类 Unix 系统通常使用 X 窗口系统。您可以使用 Xlib 直接使用它,这是低级 API。但是您可能需要一个更受欢迎和跨平台的解决方案。您可以使用:
- OpenGL 实用工具包- 过剩
- 简单快速的多媒体库- SFML
- 简单的 DirectMedia 层- SDL
- 图形库框架- GLFW(我的推荐)
GLFW 是用 C 语言编写的,并且原生支持 Windows、macOS 和许多使用 X Window 系统的类 Unix 系统,例如 Linux 和 FreeBSD。
安装后,创建一个窗口:
#include <GLFW/glfw3.h>
.
. //Entry and glfwInit()
.
GLFWwindow* window = glfwCreateWindow(1000, 1000, "MyWindow", NULL, NULL);
glfwMakeContextCurrent(window);
我知道这是一个旧帖子。但是对于像我这样最近发现这一点的人来说,这里有一个有用的图表。这只是您想要/需要抽象多远的问题;如果你不小心,你最终会尝试用二进制编码。XLib 是 SFML 的依赖项,XLib 有它的依赖项。
假设简单窗口是指绘图应该出现在屏幕上: Weston 合成器使用 EGLOutput/EGLDevice 在物理显示设备上显示合成的 Weston 桌面或单个 Wayland 应用程序。
对于用其他厂商硬件学习GEM的绘图可能会有所提示。