根据工作需要,开始学习Vulkan了。由于以前没有太接触图形的知识,感觉Vulkan学习任重道远啊。毕竟是很底层,很核心的技术,而且要用C或者C++,难是肯定的。就像之前学习shader,感到涉及了很多东西。那些光照和贴图等各种不同设置,分别能实现什么样的效果,看着就很高深了。没办法,雄关漫道真如铁,而今迈步从头越。
先从这个教程看:
它还提供了pdf版本,直接下载了本地看更方便。关于Vulkan的介绍我就不写了,这篇教程看到开发环境这一块就要记录下了。首先使下载SDK,到了LunarG网站,发现LunarG为了Vulkan生态系统的良好发展和减少碎片化,把SDK捐给了Khronos。不过再看下面的内容,它还是继续承担下载网站的功能,因此就到:
下载SDK即可。先下载SDK,再下载它的运行时,我这里选的是Windows版本Vulkan1.1.106。为了能显示窗口,还需要GLFW,就到:
https://www.glfw.org/download.html
下载,选择64位的,支持的VS版本高。然后还需要glm:
https://github.com/g-truc/glm/releases
分别解压缩放在合适位置,准备配置VS了。创建Windows Desktop Wizard:
选择类型为控制台exe以便打印输出信息,并勾选为空项目。然后打开属性设置,注意选择所有配置,不然32和64位再多设置一遍就麻烦了:
C/C++下面的常规中有个附加包含目录,添加vulkan,glm和glfw的头文件目录即可。然后是库目录:
在链接器/常规/附加库目录中添加vulkan的lib目录和glfw的lib-vc2017目录,这里我用的是vs2017所以选了这个。接着设置附加依赖:
在链接器/输入/附加依赖项中,输入vulkan-1.lib和glfw3.lib即可。还有最后一步,设置语言标准:
在C/C++的语言选项中找到C++语言标准,选择17标准即可。
在源文件中添加新建项,如main.cpp,然后添加如下代码:
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
glfwInit();
glfwWindowHint(GLFW_ClIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << extensionCount << " extensions supported" << std::endl;
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
这里代码中有个bug,我还是保留这里了。因为要给自己个教训,吃了大小写的亏。GLFW_CLIENT_API中的client,我上面的代码中写成了小写的l。搜索的时候,则是不区分大小写的,一直都没看到别人遇到这个错误。耽误了好长时间,glfw3.h文件中找到了GLFW_NO_API,接着找发现GLFW_CLIENT_API也有定义,后来又自己看了几遍才发现这个小写的l。隐藏在很长的字符串中突然小写了,还是L这个字母大小写一眼没看出来,惨痛的教训。
运行起来如下:
就是一个空白窗口,且扩展个数不为0。
接着就是Linux上的配置了,我这里用Ubuntu18.04,还是先下载SDK,不过用命令就很方便了,还是原来LunarG网站上有指导:
wget -qO - http://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.1.106-bionic.list http://packages.lunarg.com/vulkan/1.1.106/lunarg-vulkan-1.1.106-bionic.list
sudo apt update
sudo apt install vulkan-sdk
根据文档,还需要libxcb1-dev和xorg-dev:
sudo apt install libglfw3-dev
sudo apt install libglm-dev
同样将前面的代码抄写为main.cpp,放在VulkanTest目录,且在该目录创建Makefile文件,内容为:
CFLAGS = -std=c++17 -I/usr/include/vulkan
LDFLAGS = -L/usr/lib/x86_64-linux-gnu `pkg-config --static --libs glfw3` -lvulkan
VulkanTest: main.cpp
g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)
.PHONY: test clean
test: VulkanTest
LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu VK_LAYER_PATH=/usr/share/vulkan/explicit_layer.d ./VulkanTest
clean:
rm -f VulkanTest
注意这里我是用apt安装的vulkan,里面的include和lib是我自己找的路径代替了文档中的,其实一开始的那个VULKAN_SDK_PATH就没用了,因为lib和include不在一个总的目录下。apt安装的,lib在/usr/lib/x86_64-linux-gnu,而头文件在/usr/include/vulkan下,用到的layer在/usr/share/vulkan/explicit_layer.d下。如果用apt安装,这些路径应该和我这里的一样,不会变的。另外要注意的是,前面看到的Makefile里面大块的空白用的是Tab而不是空格,否则会出问题。配置完成,直接用make命令即可编译:
得到了VulkanTest的可执行程序,运行如下:
ok,Ubuntu上的Vulkan配置就完成了。好像还应该交代下我的软硬件环境以便参考,这台Ubuntu用的是双1080TI,390的驱动(已安装Cuda9.0,应该和Vulkan没关系):
接着就是安卓了,参考:
https://developer.android.com/ndk/guides/graphics
我已经安装了Android Studio3.2.1,并在其中安装了安卓9的sdk,根据这个文档指导,安装了安卓NDK,也是通过Android Studio安装的。接着到shaderc路径下,如:
C:\Users\dww\AppData\Local\Android\Sdk\ndk-bundle\sources\third_party\shaderc
执行以下命令构建shaderc:
..\..\..\ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk APP_STL=c++_static APP_ABI=all APP_PLATFORM=android-24 -j8 clean libshaderc_combined
这里可能上面的链接指示的命令不对(缺少APP_STL=c++_static),有人在GitHub上提交了问题,所以命令应该是上面的这种。执行到最后输出如下:
copy /b/y ".\obj\local\arm64-v8a\libshaderc_combined.a " ".\libs\c++_static\arm64-v8a\libshaderc.a" > NUL
md ".\libs\c++_static\x86_64" >NUL 2>NUL || rem
copy /b/y ".\obj\local\x86_64\libshaderc_combined.a " ".\libs\c++_static\x86_64\libshaderc.a" > NUL
md ".\libs\c++_static\x86" >NUL 2>NUL || rem
copy /b/y ".\obj\local\x86\libshaderc_combined.a " ".\libs\c++_static\x86\libshaderc.a" > NUL
md ".\libs\c++_static\armeabi-v7a" >NUL 2>NUL || rem
copy /b/y ".\obj\local\armeabi-v7a\libshaderc_combined.a " ".\libs\c++_static\armeabi-v7a\libshaderc.a" > NUL
接着:
https://github.com/googlesamples/vulkan-basic-samples.git
将该库克隆下来,然后更新gslang源。不过这个update_external_sources.bat有bug,更新这一步就略过了。然后就打开AndroidStudio导入该项目,以为这些都无法继续进行了,因为无法更新,项目中缺少文件,比如15-draw_cube目录下面就一个cpp文件。然而,AndroidStudio导入该项目后自动进行了一番处理,就完全恢复了:
多了很多东西,直接运行该项目,手机上得到绘制结果如下:
那么到这里,Windows、Linux和Android三个常用环境都配置运行成功了。后面的博客再继续研究Vulkan的代码,本篇博客主要是环境搭建和示例程序运行,就到此结束。