根据工作需要,开始学习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` -lvulkanVulkanTest: main.cppg++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS).PHONY: test cleantest: VulkanTestLD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu VK_LAYER_PATH=/usr/share/vulkan/explicit_layer.d ./VulkanTestclean: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的代码,本篇博客主要是环境搭建和示例程序运行,就到此结束。

Vulkan教程 - 01 环境搭建相关推荐

  1. 使用Spring boot搭建Wechat(企业微信)Demo -图文教程 -01 环境搭建

    ** Spring Boot-Wachat Demo [1] 环境搭建[适用小白的哥哥大白,高手跳过本节,内容主要记录个人搭建所遇到的坑和分享过程] ** Spring boot简介.特点等这里就不过 ...

  2. 微信点餐系统01——环境搭建

    微信点餐系统01--环境搭建 一.创建数据库表 ​ 微信点餐系统一共需要5个表. 商品表:商品编号.商品名称.商品价格.商品库存.商品描述.商品图片.商品情况(上架还是下架).它属于哪个类目(热销?男 ...

  3. Jetson Xavier NX学习笔记(三)系统烧录+开机教程+YOLOv7环境搭建+错误总结(详细版)

    Jetson Xavier NX 系统烧录+开机教程+YOLOv7环境搭建+错误总结(详细版) 文章目录 Jetson Xavier NX 系统烧录+开机教程+YOLOv7环境搭建+错误总结(详细版) ...

  4. 安装目录opencv for android 教程(环境搭建篇)

    这几周朋友几篇文章介绍了改安装目录的文章. 关联文章的地址 最近android开发异常炽热,随着手机性能越来越高,图像处程序也越来越重要, 由于opencv for android 网上教程大多为英文 ...

  5. (01)ORB-SLAM2源码无死角解析-(01) 环境搭建,demo运行,ROS一键安装_清除各种疑难杂症

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析-接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (0 ...

  6. (02)Cartographer源码无死角解析-(01) 环境搭建,demo运行,ROS一键安装_清除各种疑难杂症

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析链接如下: (02)Cartographer源码无死角解析-(00)目录_最 ...

  7. MongoDB最简单的入门教程之一 环境搭建

    MongoDB是近年来非常流行的一个介于关系数据库和非关系数据库之间的解决方案,特别广泛地应用于国内很多互联网公司,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB支持的数据结构非常松 ...

  8. spinal HDL - 01 - 环境搭建与Scala编程指南

    写在前面 SpinalHDL这个语言,我是在了解了香山处理器Chisel才知道的,一直想用一用,SpinalHDL和Chisel师承一脉,都是基于Scala来进行电路描述.其本质上仍旧是HDL而非HL ...

  9. 涂鸦Zigbee SDK开发系列教程——2.环境搭建

    本章节主要介绍如何搭建涂鸦 Zigbee ZSU 模组 SDK 开发环境. IAR安装 前往 IAR 官网下载 IAR Embedded Workbench IDE(IAR for Arm),下载安装 ...

  10. 中科世为 Z6S Linux HMI 屏幕模组上手记录 | 01 - 环境搭建

    1. 中科世为Z6S串口屏 中科世为官网 最近到手一块中科世为的串口屏,开搞! Z6S串口屏中运行的是 FlyThings OS 嵌入式物联网界面系统,FlyThings OS是中科世为基于Linux ...

最新文章

  1. CUDA 8混合精度编程
  2. React 组件生命周期
  3. python的lambda函数_Python-Lambda函数的范围及其参数?
  4. 【DIY】手把手教你 DIY 最便宜的 arduino 温湿度计,详细图文视频教程
  5. leetcode 376. 摆动序列(dp)
  6. kubernetes-Deployment部署无状态服务的原理详解(七)
  7. spark两种kafka偏移量维护方式
  8. 资料下载丨“十四五”数据库发展趋势与挑战-CCF数据库专委会
  9. MySQL workbench创建用户与授权
  10. Bailian2884 Problem III【入门】
  11. [轉]VS 2010 通过 Architecture创建UML类图设计
  12. 广州蓝景分享—「web前端素材」使用CSS动画效果(上)
  13. 计算机科学与技术导论报告
  14. python去掉左边的空格_Python去除字符串左边空格
  15. aecmap快捷键_ArcGIS编辑操作的常用快捷键
  16. 华硕笔记本重装系统bios设置
  17. mysql assertion_Mysql异常崩溃,提示 Failing assertion: extern_len = part_len
  18. 投影向量计算公式的推导
  19. LWIP-工业以太网交换机 SNMP功能与SStool功能完成笔记
  20. 爬取豆瓣读书的图书信息和评论信息

热门文章

  1. tr命令解析_学习笔记
  2. 中考英语听说计算机考试成绩查询,中考英语听说考试成绩查询
  3. win7共享中心服务器运行失败,win7网络共享中心打不开怎么办
  4. android微信图片编辑带滤镜,微信更新了一个小功能,一些图片编辑软件可能要被打入冷宫了...
  5. opencv实践中遇到的问题
  6. excel2013 最大行数列数
  7. 树莓派 Linux VS code 远程断点调试 .net 6.0 保姆级教程
  8. 帝国cms支持php多少,帝国cms支持php吗
  9. 重温Spring笔记3 - 依赖注入
  10. 关于修改了网页源文件但是网站显示却没变的问题解决