Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口(API),最早由科纳斯组织在2015年游戏开发者大会(GDC)上发表。
介绍
在维基百科上搜索Vulkan,可以发现本篇的开头就是摘自它的部分介绍。冗长的介绍这里不做复制,毕竟Vulkan又名"Verbose",Verbose除了能翻译为"冗长的",我觉得翻译成"啰嗦的"更为贴切, 它的"啰嗦"不仅体现在要实现图形学的hello world程序"三角形绘制"需要上千行代码,这对于熟悉Opengl程序的开发人员来讲是不可想象的,甚至比自己用CPU实现一套软光栅器更为复杂!同时也体现在它的api复杂难懂,对于入门图形学的新手来讲并不是太简单。基于此我们不禁会问那学这个有意义么?我觉得是有意义的,在维基百科上对Vulkan的介绍都是围绕着低开销这个主题吹牛皮,怎么实现低开销?或许下面这个公式可以解释:
more control = more optimisation
解释过来的意思就是:提供更多的底层代码控制权限,意味着提供了更多的优化空间。知道这个意思后,我们对Vulkan的复杂性或许多了那么一丝丝包容,但是正如程序员英伟达所言:
由于OpenGL的复杂度和维护难度比Vulkan低很多,在多数情况下也能提供理想的整体性能,现阶段OpenGL仍是个很好的选择。 ——英伟达
英伟达说的意思其实很直白:Vulkan虽然给开发者提供了更多的自由度,如果这个开发者本身不自由(非大牛),那用回Opengl也是个不错的选择。原因就在于如果开发者对内存管理机制,对程序运行机制没有十足的理解,那就可能会误用Vulkan乃至乱用Vulkan导致运行的效率甚至比原有的Opengl运行效率更低,那这样就得不偿失。
安装
1.打开lunarXchange网站,windows平台选择1.1.108.0版本。(lunarG是一个专门从事视频卡设备驱动程序开发的公司,在2009年成立,2014年与Valve合作,合作目的是想把尚未完成的Vulkan驱动程序并入其Steam OS的未来版本。在2015年lunarG分成了两支团队,一支团队由Valve出于上述目的进行开发的桌面团队,另一支并入了Google Android团队,提供Android平台的Vulkan支持。)
下载后双击该安装文件。
2. 点击"I Agree"。
3. 选择路径后点击Install。
4.安装完成后点击Finish。
5. 由于Vulkan没有提供窗口创建功能,所以在使用Vulkan前还需要下载窗口创建相关的库,这里我们选择GLFW。跳转至GLFW下载页,点击32-bit Windows binaries按钮下载。(使用32位是因为稳定性考虑,很多人使用64位的库发现运行出错,甚至运行不成功)。
6. 下载完成后进行解压,解压后把刚刚的文件夹重命名为GLFW,并放在VulkanSDK文件夹下。
7. 下载GLM库,该库是针对OpenGL的数学库,为了方便数学运算,我们选择下载该库。跳转至GLM链接下载。
8. 点击页面中的Downloads(上图红框所示),跳转至GLM数学库的下载页面。
9. 点击"glm-0.9.9.8.zip"下载并解压,并放至VulkanSDK文件夹下,进入文件夹内部,删掉其余文件夹,只保留glm文件夹即可。
10. 回退至上一级文件夹,并把glm文件夹重命名为GLM。
11. 打开Visual Studio 2019,创建新项目。
12. 选择空项目。
13. 项目名称命名为VulkanProject。并点击创建。
14. 点击项目属性,出来属性页后,点击C/C++项。
15. 点击附加包含目录,分别定位Vulkan,GLFW以及GLM库的位置。
16. 点击链接器,附加库目录。
17. 编辑附加库目录,这里选择Lib32的原因是因为我们之前下的GLFW库就是32位的,所以得对应上。
18. 接着点击链接器的输入选项,配置附加依赖项的内容分别为vulkan-1.lib与glfw3.lib,点击确定并应用。
19. 接着测试GLFW,Vulkan以及GLM库是否工作良好,可在源文件目录下新建main.cpp文件,并键入下述代码:
// 会自动包含vulkan.h
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
// 计算时强制使用弧度值
#define GLM_FORCE_RADIANS
// opengl的深度值是从-1~1,我们需要转换深度值为0~1
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/glm.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
// 初始化glfw
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(1024, 720, "Vulkan", nullptr, nullptr);
uint32_t extCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extCount, nullptr);
printf("Extension count: %in", extCount);
glm::mat4 testMatrix(1.0f);
glm::vec4 testVec(1.0f);
auto testRes = testMatrix * testVec;
// 窗口是否处于可关闭状态
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
// 清理窗口对象
glfwDestroyWindow(window);
// 退出glfw,它的作用可以清理窗口句柄以及各种初始化的资源等,如果glfwInit调用成功
// 就必须在程序结束前调用
glfwTerminate();
return 0;
}
代码中可以发现我们并没有引入任何的vulkan头文件,这是因为我们通过
#define GLFW_INCLUDE_VULKAN
代码定义了我们需要在GLFW中使用Vulkan,由GLFW库自动帮我们引入:
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API)
该行代码告诉glfw库,不使用任何内置的图形API,它有如下值:
20. 运行程序,有看到窗口并且控制台没有报错信息,且输出了值为12(至少不能为0),说明Vulkan开发的相关配置已经搞定。
Vulkan系列未完待续。。。
喜欢就关注我吧o(* ̄▽ ̄*)ブ