Vulkan教程 – 01 环境搭建

根据工作需要,开始学习Vulkan了。由于以前没有太接触图形的知识,感觉Vulkan学习任重道远啊。毕竟是很底层,很核心的技术,而且要用C或者C++,难是肯定的。就像之前学习shader,感到涉及了很多东西。那些光照和贴图等各种不同设置,分别能实现什么样的效果,看着就很高深了。没办法,雄关漫道真如铁,而今迈步从头越。

先从这个教程看:

https://vulkan-tutorial.com/

它还提供了pdf版本,直接下载了本地看更方便。关于Vulkan的介绍我就不写了,这篇教程看到开发环境这一块就要记录下了。首先使下载SDK,到了LunarG网站,发现LunarG为了Vulkan生态系统的良好发展和减少碎片化,把SDK捐给了Khronos。不过再看下面的内容,它还是继续承担下载网站的功能,因此就到:

https://vulkan.lunarg.com/

下载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的代码,本篇博客主要是环境搭建和示例程序运行,就到此结束。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容