【小沐学Vulkan】Vulkan入门简介与开发环境配置
Vulkan 是新一代图形和计算 API,用于高效、跨平台访问 GPU。Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯组织在2015年游戏开发者大会(GDC)上发表。号称是glNext。旨在提供更低的CPU开销与更直接的GPU控制,其理念大致与Direct3D 12和Mantle类似。作为业界唯一的开放标准现代 GPU API,Vulkan 在使开发人员能够编写可移植
1、简介
Vulkan 是新一代图形和计算 API,用于高效、跨平台访问 GPU。
Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯组织在2015年游戏开发者大会(GDC)上发表。号称是glNext。旨在提供更低的CPU开销与更直接的GPU控制,其理念大致与Direct3D 12和Mantle类似。
作为业界唯一的开放标准现代 GPU API,Vulkan 在使开发人员能够编写可移植到多个不同平台的应用程序方面独树一帜。Vulkan 包括最新的图形技术,包括光线追踪,并集成到 NVIDIA 的 NVIDIA GeForce、Windows 和 Linux 上的 RTX 和 Quadro 解决方案、NVIDIA Shield 以及使用 Android 或 Linux 的 Jetson 嵌入式计算平台的生产驱动程序中。
- Vulkan相对于上一代API的优势:
- Vulkan API适用于从高性能电脑到移动低功耗设备的显卡;
相比于Direct3D 12,Vulkan与前身OpenGL类似,受多种操作系统支持。Vulkan已经能在Windows 7、Windows 8、Windows 10、Tizen、Linux与Android上运行(iOS和macOS有第三方支持)。 - 通过批量处理(Batching)减少CPU负载,使CPU可以执行更多其他的计算或渲染任务。
- 在多核心CPU上,Vulkan能对核心与线程进行优化。Direct3D 11与OpenGL 4最初为单核心CPU设计,尽管后来出现了针对多核心CPU优化的扩展,不过与Vulkan相比,优化仍不是很好。
- 减少了驱动程序的开销与维护工作。OpenGL使用高级着色语言GLSL编写着色器,不同的驱动在程序运行时需要执行自身的GLSL编译器,将程序的着色器转换为GPU可执行的机器代码。而Vulkan驱动将着色器语言预先转化为SPIR-V(Standard Portable Intermediate Representation)的中间二进制格式,其行为类似于Direct3D的HLSL着色器。通过着色器预编译,应用程序加载速度更快,并且3D场景可以使用更多种着色器。Vulkan驱动只需对GPU进行优化并生成代码,这使得驱动程序更容易维护,驱动程序包更小(GPU供应商仍需在驱动程序中提供OpenGL与OpenCL的支持)。
- 计算与图形处理的统一管理,因此Vulkan无需与单独的计算API配合使用。
- Vulkan API适用于从高性能电脑到移动低功耗设备的显卡;
新版本的 Vulkan 规格已于 2022 年 1 月发布,其中包含开发者所需的并且经过验证的重要功能。发布规格当天,NVIDIA 推出了适用于 Windows 和 Linux 的完整功能 Vulkan 1.3 驱动。这些驱动还支持 Vulkan Roadmap 2022 里程碑中的扩展功能集。
2、下载和安装
https://www.lunarg.com/vulkan-sdk/
https://vulkan.lunarg.com/sdk/home#windows
下载sdk之后如下:
安装VulkanSDK-1.3.261.1-Installer.exe如下:
- 安装欢迎页
- 安装文件夹
- 选择组件
- 许可协议
- 准备安装
- 开始安装
- 安装结束
安装后的文件夹如下:
然后运行Bin目录下的vkcube.exe,
你应该能看到一个旋转的立方体,这说明你的显卡和驱动支持Vulkan。
3、代码示例
3.1 简单测试(glfw+glm)
- glfw配置
GLFW是一个开源的多平台库,用于OpenGL,OpenGL ES和 桌面上的 Vulkan 开发。它提供了一个简单的 API 来创建 窗口、上下文和表面,接收输入和事件。
GLFW是用C语言编写的,支持Windows,macOS,X11和Wayland。
GLFW在zlib / libpng许可证下获得许可。
https://www.glfw.org/ - glm配置
OpenGL Mathematics (GLM) 是基于 OpenGL 着色语言 (GLSL) 规范的图形软件的标头C++数学库。
GLM 提供的类和函数的设计和实现具有与 GLSL 相同的命名约定和功能,因此任何了解 GLSL 的人都可以在 C++ 中使用 GLM。
此项目不仅限于 GLSL 功能。基于 GLSL 扩展约定的扩展系统提供了扩展功能:矩阵变换、四元数、数据包、随机数、噪声等…
https://github.com/g-truc/glm
准备好GLFW和GLM的sdk代码。
- 头文件夹:
D:\Program Files\My3rdPartyGit\glm-0.9.9.8;
D:\Program Files\My3rdPartyGit\glfw-3.3.6\include;
D:\VulkanSDK\1.3.261.1\Include;
- 库文件夹:
D:\Program Files\My3rdPartyGit\glfw-3.3.6\lib\x64\Debug;
D:\VulkanSDK\1.3.261.1\Lib;
- 库文件:
glfw3.lib;
vulkan-1.lib;
新建一个控制台的测试项目如下:
// ConsoleApplication16.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#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\n";
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
编译后运行如下:
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!
更多推荐
所有评论(0)