起因是看到有人在Reddit上推荐通过SDL这种库上手学习C/Cpp,我看了一下发现很不错,于是进一步看了看了解了SFML.最后决定通过写写openGL学习一下c/c++.
前置知识
绘图API包括OpenGL,Vulkan,DirectX,Metal等等,其中
- DX11、DX12:微软公司在Windows系统上所开发的3D图形编程接口
- OpenGL:OpenGL是一套跨语言、跨平台的API,它的实现存在于Windows、部分UNIX和Mac OS,这些实现一般由显卡厂商提供,而且非常依赖于该厂商提供的硬件。
- Vulkan:下一代的OpenGL,相比之下,Vulkan更接近底层,并且能很好地分配CPU核心来执行并行任务
- Metal:Metal API 由苹果公司提供,它旨在为iOS、iPadOS、macOS和tvOS上的应用程序提供对GPU硬件的低级访问来提高性能,它与Vulkan、DX12都属于低级别的API
此外的SDL与SFML是多媒体开发库,包含了绘图和网络,音频等功能,比较全面.
SDL
SDL是一个跨平台的多媒体开发库,用于游戏开发和其他多媒体应用。以下是SDL的特点:
2D图形渲染: SDL提供了2D图形渲染的功能,虽然不如SFML那样高级,但仍然足够满足一般的2D游戏需求。
音频: SDL支持音频播放,但相较于SFML而言,其音频功能较为基础。
窗口和事件处理: 提供了创建窗口、处理鼠标、键盘事件的功能。
低级硬件访问: SDL也提供了对硬件的低级访问,使得开发者可以更灵活地操作硬件。
SFML
SFML是一个现代、面向对象的多媒体库,专注于2D游戏开发和多媒体应用程序。以下是SFML的特点:
2D图形渲染: SFML提供了简单易用的2D图形渲染接口,使得创建2D游戏非常容易。
音频: SFML支持音频播放和音频捕获功能,可以用来添加音乐、音效等。
窗口和事件处理: 提供了创建窗口、处理鼠标、键盘事件的功能。
网络: SFML包含网络模块,允许游戏之间进行网络通信。
环境搭建
使用C++开发,环境搭建不是小问题.Linux上配置makefile或者CMake添加lib和dll库,而windows还是使用vs添加lib和头文件即可.下面使用Windows搭建环境.
首先安装GLFW,它之前是freeglut和glut
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文、定义窗口参数以及处理用户输入
从官网下载Download | GLFW,然后将头文件目录和lib库目录配置到vs的C++配置中,再将dll放到执行程序所在目录.
如果你是Windows平台,opengl32.lib已经包含在Microsoft SDK里了,它在Visual Studio安装的时候就默认安装了。由于这篇教程用的是VS编译器,并且是在Windows操作系统上,我们只需将opengl32.lib添加进连接器设置里就行了。值得注意的是,OpenGL库64位版本的文件名仍然是opengl32.lib(和32位版本一样),虽然很奇怪但确实如此。
事实上这样就能执行一些程序了.
因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用
静态链接和动态链接的相关介绍C++静态库与动态库 | 菜鸟教程 (runoob.com),c++引入第三方库就是使用这些库.如果你想的是使用C++开发成熟的应用,那还是推荐使用Qt.这里的库更多的还是去造轮子或者是学习的,毕竟c++就是干这个的
此外还需要其他工具,因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,
OpenGL被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。
早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少有控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性