Vulkan入门(一)-环境配置.md

参考资料

  1. https://vulkan.lunarg.com/doc/sdk/1.1.106.0/linux/getting_started.html
  2. https://github.com/google/glog
  3. [pkg-config的用法]https://www.cnblogs.com/chris-cp/p/3580002.html
  4. [解决/usr/local/lib/libglog.so.0: error adding symbols: DSO missing from command line]https://blog.csdn.net/u010987458/article/details/72235408
  5. https://www.glfw.org/docs/3.3/build_guide.html#build_link_cmake_package
  6. [GLFW]https://www.glfw.org/
  7. [GLM]https://github.com/g-truc/glm

简述

本文主要是介绍如何在 ubuntu 机器上安装并编译Vulkan程序。

一. 准备环境

1.1 开发环境

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install libglm-dev cmake libxcb-dri3-0 libxcb-present0 libpciaccess0 libpng-dev libxcb-keysyms1-dev libxcb-dri3-dev libx11-dev  libmirclient-dev libwayland-dev libxrandr-dev libxcb-ewmh-dev

sudo apt-get install git libpython2.7

1.2 下载 SDK

官方网站:https://vulkan.lunarg.com/ 下载SDK包:vulkan-sdk.tar.gz

cd ~/Program
mkdir vulkan
cd vulkan
tar zxf $HOME/Downloads/vulkan-sdk.tar.gz

解压后的文件目录如下:

文件夹描述
x86_64/binVulkan工具和命令
x86_64/include/vulkan编译链接头文件
x86_64/libVulkan加载程序库和layer运行时库
x86_64/etc/explicit_layer.d.json 用于Vulkan验证层的清单文件
config样本层设置文件,系统配置说明
docKhronos SPIRV,Vulkan,Loader和WSI规范
examplesVulkan程序示例
samplesVulkan的示例代码
sourceglslang和所选Vulkan组件的源和调试库

1.3 安装SDK

source ~/Program/vulkan/1.1.106.0/setup-env.sh

export VULKAN_SDK=~/vulkan/1.1.106.0/x86_64
export PATH=$VULKAN_SDK/bin:$PATH
export LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH
export VK_LAYER_PATH=$VULKAN_SDK/etc/explicit_layer.d

大功告成,检查一下:输入vulkaninfo
ubuntu@18.04L ~ vulkaninfo
Cannot create Vulkan instance.
/home/lunarg/sdk-build/Vulkan-Tools/vulkaninfo/vulkaninfo.c:921: failed with VK_ERROR_INCOMPATIBLE_DRIVER

wtf, 发生了什么?等等,貌似我们没有检查是否安装了驱动。。。

1.4 安装驱动

sudo add-apt-repository ppa:oibaf/graphics-drivers
sudo apt update
sudo apt upgrade
apt install libvulkan1 mesa-vulkan-drivers vulkan-utils

// 或者试试:
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt upgrade
sudo apt install nvidia-graphics-drivers-396 nvidia-settings vulkan vulkan-utils

检查一下:输入vulkaninfo
在这里插入图片描述
或者:vulkaninfo --html , 在当前目录生成 vulkaninfo.html 文件,用浏览器打开,可以看到更多信息
在这里插入图片描述

1.5. 运行示例程序

cd Program/vulkan/1.1.160.0/examples
mkdir build
cd build
cmake ..
make

make成功后会在当前目录生成:
在这里插入图片描述
运行示例程序:

./vkcube

在这里插入图片描述
一个旋转的立方体~

二. GLFW 安装

Vulkan本身是一个与平台无关的API,不包括用于创建显示渲染结果的窗口的工具。 为了从Vulkan的跨平台优势中受益并避免X11的限制,我们将使用GLFW库来创建一个支持Windows,Linux和MacOS的窗口。
还有其他可用于此目的的库,如SDL,但GLFW的优势在于它除了窗口创建之外,还抽象了Vulkan中一些其他特定于平台的东西。
我们将从源代码安装GLFW而不是使用软件包,因为Vulkan支持需要最新版本。 可以在官方网站上找到这些来源。
将源代码解压缩到一个方便的目录,并使用CMakeLists.txt等文件打开目录中的终端。

github地址:https://github.com/glfw/glfw
解压后进入其主目录:cmake .
有报错:

-- Looking for shmat - found
-- Found X11: /usr/lib/x86_64-linux-gnu/libX11.so
CMake Error at CMakeLists.txt:220 (message):
  The Xinerama headers were not found

-- Configuring incomplete, errors occurred!
See also "/home/jh/Program/vulkan/glfw-master/CMakeFiles/CMakeOutput.log".
See also "/home/jh/Program/vulkan/glfw-master/CMakeFiles/CMakeError.log".

缺少环境:
$ ~/Program/vulkan/glfw-master  sudo apt-get install libsdl2-dev

然后重新: cmake .

?  ~/Program/vulkan/glfw-master  cmake .
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) 
-- Using X11 for window creation
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jh/Program/vulkan/glfw-master

濡染没有报错,但这个也是没有成功的:缺少Doxygen
sudo apt-get install doxygen

重新: cmake .
最后: make
成功后:sudo make install

三. GLM 安装

与DirectX 12不同,Vulkan不包含用于线性代数运算的库,因此我们必须下载一个。
GLM是一个很好的库,设计用于图形API,也常用于OpenGL。
它是一个只有头的库,可以从libglm-dev包安装:

sudo apt install libglm-dev

四. 手动编译示例代码

4.1 在编译示例代码的时候老是报错,找不到vulkan头文件。

$ gcc -o main main.cpp -lglfw3
In file included from main.cpp:2:
/usr/local/include/GLFW/glfw3.h:215:12: fatal error: vulkan/vulkan.h: 没有那个文件或目录
   #include <vulkan/vulkan.h>
            ^~~~~~~~~~~~~~~~~
compilation terminated.

当然是环境设置的问题:需要将头文件等拷贝到对应system文件夹

cd Program/vulkan/1.1.160.0/x86_64
sudo cp -r include/vulkan/ /usr/local/include/
sudo cp -P lib/libvulkan.so* /usr/local/lib/
sudo cp lib/libVkLayer_*.so /usr/local/lib/
sudo mkdir -p /usr/local/share/vulkan/explicit_layer.d
sudo cp etc/explicit_layer.d/VkLayer_*.json /usr/local/share/vulkan/explicit_layer.d    

sudo ldconfig

4.2 error adding symbols: DSO missing from command line

make
g++ -std=c++17 -I/home/jh/Program/vulkan/1.1.160.0/x86_64/include -o VulkanTest main.cpp -L/home/jh/Program/vulkan/1.1.160.0/x86_64/lib -lvulkan -lglfw3
/usr/bin/ld: //usr/local/lib/libglfw3.a(vulkan.c.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
/usr/bin/ld: //lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [Makefile:8:VulkanTest] 错误 1

cd /usr/lib/
ll |grep -iE “liblog”
没有文件

https://github.com/google/glog
下载解压, 进入解压后的主目录,执行:
./autogen.sh && ./configure && make && make install

如果报错:autogen.sh: 5: autogen.sh: autoreconf: not found
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

重新执行:./autogen.sh && ./configure && make && make install
可能还有权限问题:

-- Up-to-date: /usr/local/include/GLFW
CMake Error at cmake_install.cmake:41 (file):
  file INSTALL cannot set permissions on "/usr/local/include/GLFW"


make: *** [Makefile:118:install] 错误 1

执行:
cd …
chmod a+x glog-master -R
cd glog-master
make && make install

okay,现在可以在Makefile文件中添加:-lglog

重新 make 还是会存在这个问题,笔者查阅各种资料,大部分指明在Makefile中加入 -ldl 即可,尝试后失败。
最后发现是 Makefile 文件写的有问题,改成如[#5.2]即可.

4.3 运行示例

make 成功后,会在当前目录生成 VulkanTest 可执行文件:

./VulkanTest

结果如下:
在这里插入图片描述

五. 主要代码

5.1 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;
}

5.2 Makefile

VULKAN_SDK_PATH = /home/jh/Program/vulkan/1.1.160.0/x86_64

CFLAGS = -std=c++17 -I$(VULKAN_SDK_PATH)/include
LDFLAGS = -L$(VULKAN_SDK_PATH)/lib -lvulkan `pkg-config --static --libs glfw3`
LDFLAGS += -ldl

VulkanTest: main.cpp
	g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)

.PHONY: test clean

test: VulkanTest
    LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
        VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/explicit_layer.d ./VulkanTest

clean:rm -f VulkanTest
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vulkan被称为OpenGL的接班人,性能果然是霸气外漏,更能够承载下一个时代的图形渲染编程。 GPU高性能渲染的课题进入了一个新的阶段,对于计算细节的控制,多核CPU多线程渲染以及高性能算法的灵活设计需求日益旺盛。图形程序员需要有更加强力且灵活的工具,来“解锁”我们自身的控制能力,OpenGL的较高度封装性以及单纯的状态机模式显然已经无法适应现代化图形渲染的强烈需求。为什么要学习Vulkan?正如前言所说,Vulkan已经成为了下一个时代的图形渲染主流API,早已经被各大商业引擎(Unreal Engine、Unity3D)所支持。那么我们的同学就有如下问题需要明晰:1 作为游戏程序员我们只学会了UE或者Unity3D,那么就只能作为一个普通的程序员,如果能够结合Vulkan的学习对商用引擎理解更加深刻,就可以更好的发挥引擎威力甚至更改引擎的源代码,实现更多的可能,让你在各大公司之间都“蛇形走位,游刃有余” 2 作为自研引擎工作人员,你可能在工业软件领域从业、也有可能在影视渲染领域从业、也可能在其他的图形系统领域(军工、GIS、BIM)等领域,那么熟练的掌握Vulkan就可以针对自己公司的不同领域需求进行不同的引擎定制开发,从而获得牢不可破的地位,对于自身职业发展有着极大的优势! 总而言之,越早学习Vulkan,就越能与别人拉开差距,让Vulkan称为你升职加薪、壮大不可替代性的核武器! 课程简介:本课程详细讲解了Vulkan从小白到入门的基础理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了计算机图形学基础理论,计算机图形学数学推导,Vulkan基础系统设计理论,基础单元(实例,设备,交换链), 渲染管线,RenderPass, 指令与多线程, 顶点描述与实验, Uniform与描述符, 图像与采样, 深度与反走样,模型与摄像机等内容;课程中会对Vulkan复杂抽象的API进行一次包装层的封装,将相关的API都进行聚合与接口设计,作为游戏或者图形引擎来讲,这是至关重要的第一步。这一个封装步骤,也被称为API-Wrapper,经过包装后的类库,同学可以在此之上根据自己的具体需求进行扩展,从而得到最适合自己的类库内容。本课程为系列化课程,在铸造基石篇章之后,会继续使用本包装类库进行改良,并且实现Vulkan API下的各类效果以及高级特性的开发教学。 课程优势:1 本课程会从计算机图形学的基础渲染管线原理出发,带领0基础的同学对计算机图形学进行快速认知,且对必要的知识点进行筛选提炼,去掉冗余繁杂的教学内容,更加适合新手对Vulkan渲染体系入门了解。 2 本课程会对计算机图形学所涉及的数学知识及如何应用到渲染当中,进行深入的讲解,带领同学对每一行公式展开认识,从三维世界如何映射到二维的屏幕,在学习完毕后会有清晰的知识体系 3 本课程会带领同学认知每一个Vulkan的API,并且在代码当中插入详细的注释,同学们在学习的时候就可以参照源代码进行一系列尝试以及学后复习 4 本课程所设计的包装层,会带领同学一行一行代码实现,现场进行Debug,对于Vulkan常出现的一些问题进行深入探讨与现场纠正  学习所得:1 同学们在学习后可以完全了解从三维世界的抽象物体,如何一步步渲染称为一个屏幕上的像素点。2 同学们在学习后可以完全掌握基础的Vulkan图形API,并且了解Vulkan当中繁多的对象之间相互的联系,从而可以设计更好的图形程序3 同学们在跟随课程进行代码编写后,可以获得一个轻量级的Vulkan底层API封装库(Wrapper),从而可以在此之上封装上层的应用,得到自己的迷你Vulkan图形渲染引擎当然,在达到如上三点之后,如果可以更进一步学习Vulkan的进阶课程,同学们可以获得更好的职业发展,升职加薪之路会更加清晰,成为公司不可替代的强力工程师 本课程含有全套源代码,同学购买后,可以在课程附件当中下载 完全不懂图形学可以学习么?使用层面上来讲是没有问题的,老师在每个api讲解的时候,都会仔细分析api背后的原理,所以可以跟随下来的话,能够编程与原理相融,学会使用 数学不好可以学习么?学习图形类课程,最好能够入门级别的线性代数,具体说就是: 1 向量操作 2 矩阵乘法 3 矩阵的逆、转置 这几个点就足够 学习后对就业面试有什么作用?目前类似Vulkan的渲染知识是一切引擎的基础,只要能够跟随每一节课写代码做下来,游戏公司、工业软件公司等都是非常容易进去的,因为原理层面已经通晓,面试就会特别有优势。同学可以在简历上写熟悉VulkanAPI并且有代码经验,对于建立筛选以及面试都会有很大的帮助,对于薪资也会有大幅度提升

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值