Vulkan介绍与安装

Number of views 83

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运行效率更低,那这样就得不偿失。

安装

  • 打开lunarXchange网站,windows平台选择1.1.108.0版本。(lunarG是一个专门从事视频卡设备驱动程序开发的公司,在2009年成立,2014年与Valve合作,合作目的是想把尚未完成的Vulkan驱动程序并入其Steam OS的未来版本。在2015年lunarG分成了两支团队,一支团队由Valve出于上述目的进行开发的桌面团队,另一支并入了Google Android团队,提供Android平台的Vulkan支持。)

image.png

下载后双击该安装文件。

  • 点击"I Agree"。

image.png

  • 选择路径后点击Install。

image.png

  • 安装完成后点击Finish。

image.png

  • 由于Vulkan没有提供窗口创建功能,所以在使用Vulkan前还需要下载窗口创建相关的库,这里我们选择GLFW。跳转至GLFW下载页,点击32-bit Windows binaries按钮下载。(使用32位是因为稳定性考虑,很多人使用64位的库发现运行出错,甚至运行不成功)。

image.png

  • 下载完成后进行解压,解压后把刚刚的文件夹重命名为GLFW,并放在VulkanSDK文件夹下。

image.png

  • 下载GLM库,该库是针对OpenGL的数学库,为了方便数学运算,我们选择下载该库。跳转至GLM链接下载。

image.png

image.png

  • 点击"glm-0.9.9.8.zip"下载并解压,并放至VulkanSDK文件夹下,进入文件夹内部,删掉其余文件夹,只保留glm文件夹即可。

image.png

  • 回退至上一级文件夹,并把glm文件夹重命名为GLM。

image.png

  • 打开Visual Studio 2019,创建新项目。

image.png

  • 选择空项目。

image.png

  • 项目名称命名为VulkanProject。并点击创建。

image.png

  • 点击项目属性,出来属性页后,点击C/C++项。

image.png

image.png

  • 点击附加包含目录,分别定位Vulkan,GLFW以及GLM库的位置。

image.png

  • 点击链接器,附加库目录。

image.png

  • 编辑附加库目录,这里选择Lib32的原因是因为我们之前下的GLFW库就是32位的,所以得对应上。

image.png

  • 接着点击链接器的输入选项,配置附加依赖项的内容分别为vulkan-1.lib与glfw3.lib,点击确定并应用。

image.png

  • 接着测试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: %i\n", 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库自动帮我们引入:

image.png

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API)

该行代码告诉glfw库,不使用任何内置的图形API,它有如下值:

image.png

  • 运行程序,有看到窗口并且控制台没有报错信息,且输出了值为12(至少不能为0),说明Vulkan开发的相关配置已经搞定。

image.png

image.png

0 Answers