一、概述

最近因为工作需要开始学习Vulkan的相关知识,作为初学者,发现相对较好的学习资料莫过于vulkan-tutorial,在自己学习Vulkan的过程中,决定将自己的理解记录下来,一是为了加深记忆,二是为了分享给大家一起探讨学习,因此有了本系列文章,开发环境搭建是本系列文章的第一篇。

二、开发环境搭建

2.1 安装Microsoft Visual Studio Community 2022

Vulkan作为跨平台的图形API,直接支持的开发语言为c/c++,最合适(经济)的开发平台是Windows,因此我选择免费的开发工具Microsoft Visual Studio Community 2022,安装过程并不复杂,唯一要注意的是要选择使用C++的桌面开发相关组件。

2.2 下载Vulkan SDK并安装

从官网下载最新的SDK,当前最新版本为1.3.243.0,双击运行安装程序,只需一直点击下一步就行,唯一要注意的是选择组件,为了避免遗漏,这里选择安装所有的组件:

安装成功后在开始菜单中可以找到Vulkan Cube程序,运行结果如下:

同时安装程序为自动完成环境变量设置,环境变量VK_SDK_PATH和VULKAN_SDK都是指向SDK的安装位置,其次Path环境变量也包含SDK的安装位置。

2.3 新建窗口项目

启动Visual Studio新建Windows 桌面向导:

点击下一步,输入项目名称,创建时选择桌面应用程序和 空项目:

在解决方案资源管理器中右键点击刚刚新建的项目,进入属性设置页面,C++语言标准设置为ISO C++17 标准(std:c++17):

将$(VULKAN_SDK)\Include添加到附加包含目录中,也就是将Vulkan SDK的头文件目录添加到项目的头文件搜索目录中:

将$(VULKAN_SDK)\Lib添加到附加库目录中,也就是将vulkan动态库路径添加到项目动态库搜索目录中:

最后将项目要依赖的vulkan-1.lib添加到附加依赖项中:

注意这里没有添加glfw的依赖,因为本系列笔记使用Win32 API创建窗口,没有使用glfw。

2.4 编写窗口代码

新建源文件main.cpp,在源文件中添加相关头文件:

#include <windows.h>

#include <vulkan/vulkan.h>

#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp> #include <malloc.h>
#include <tchar.h>

创建窗口需要windows.h,Vulkan相关的使用需要vulkan/vulkan.h,矩阵和向量运算需要使用glm相关的头文件glm/vec4.hpp和glm/mat4x4.hpp,分配栈内存需要malloc.h,使用Unicode字符相关方法需要tchar.h。

void TRACE(LPCTSTR lpszFmt, ...) {
va_list args;
va_start(args, lpszFmt);
int len = _vsctprintf(lpszFmt, args) + 1;
TCHAR* lpszBuf = (TCHAR*)_malloca(len * sizeof(TCHAR));
if (lpszBuf != NULL) {
_vstprintf_s(lpszBuf, len, lpszFmt, args);
OutputDebugString(lpszBuf);
}
va_end(args);
_freea(lpszBuf);
}

TRACE方法主要封装OutputDebugString,便于输出调试信息,类似于Android的log输出,调试信息不是输出到控制台中,而是通过DebugView或Visual Studio的即时窗口查看。该方法参考自OutputDebugString方便格式化WIN32封装。

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd, msg, wParam, lParam);
}

该方法为Win32的窗口消息回调,当窗口接受鼠标和按键信息时,都会回调这个方法进行处理,这里不过多展开,详细介绍可参考Win32 和 C++ 入门 - Win32 apps | Microsoft Learn。

int WINAPI WinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd) {
LPCWSTR window_class = L"Learning Vulkan Class";
LPCWSTR window_title = L"Learning Vulkan";
int window_width = 800;
int window_height = 600; WNDCLASSEX wcx{};
wcx.cbSize = sizeof(wcx);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = WindowProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcx.lpszMenuName = NULL;
wcx.lpszClassName = window_class;
wcx.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);; if (!RegisterClassEx(&wcx)) {
MessageBox(NULL,
L"Call to RegisterClassEx failed!",
L"Learning Vulkan",
NULL);
return 1;
}

WinMain方法为Win32窗口应用程序的入口函数,和控制台应用程序入口函数main对应。接下的步骤为注册窗口,窗口注册详细介绍参考创建窗口 - Win32 apps | Microsoft Learn。

    HWND hwnd = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,
window_class,
window_title,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
window_width, window_height,
NULL,
NULL,
hInstance,
NULL
); if (!hwnd) {
MessageBox(NULL,
L"Call to CreateWindow failed!",
L"Learning Vulkan",
NULL);
return 1;
} ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);

CreateWindowEx为创建窗口,创建完成后使用ShowWindow进行显示,UpdateWindow更新重绘窗口,类似于Android View的invalidate。

    uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); TRACE(L"%d extensions supported\n", extensionCount); glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;

测试Vulkan SDK是否配置成功,一是枚举支持的实例(Instance)扩展数量,二是进行glm测试。

    MSG msg{};
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return (int)msg.wParam;
}

最后需要不断获取本窗口的信息,功能类似于glfw的glfwPollEvents方法。如果没有while循环,程序将直接结束退出。

运行程序可看到如下窗口:

在即时窗口中可以看到类似输出:

至此,Vulkan的开发环境算是搭建完成,后续的开发都会在此基础上进行。本文中创建的项目完整代码可在GitHub上查看。

三、参考文档

  1. Win32 和 C++ 入门 - Win32 apps | Microsoft Learn

  2. OutputDebugString方便格式化WIN32封装 - 疯陈演义 - 博客园

  3. vulkan-tutorial

Vulkan学习笔记之开发环境搭建的更多相关文章

  1. Cocos2dx 学习笔记整理----开发环境搭建

    最近在学习cocos2dx,预备将学习过程整理成笔记. 需要的工具和环境整理一下: 使用的版本 cocos2dx目前已经出到了v3.1.1,学习和项目的话还是用2.2.3为宜,毕竟不大想做小白鼠,并且 ...

  2. Flink学习笔记:Flink开发环境搭建

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  3. PHP学习笔记(1) - 开发环境搭建

    运行环境:phpstudy 它基本包括运行php应用需要的一切,php. apache.mysql,一键傻瓜安装 装好之后只需要配置虚拟主机和修改host文件就可以支持多站点 下载: http://w ...

  4. angular2.0学习笔记1.开发环境搭建 (node.js和npm的安装)

    开发环境, 1.安装Node.js®和npm, node 6.9.x 和 npm 3.x.x 以上的版本. 更老的版本可能会出现错误,更新的版本则没问题. 控制台窗口中运行命令 node -v 和 n ...

  5. Hadoop学习笔记(3)——分布式环境搭建

    Hadoop学习笔记(3) ——分布式环境搭建 前面,我们已经在单机上把Hadoop运行起来了,但我们知道Hadoop支持分布式的,而它的优点就是在分布上突出的,所以我们得搭个环境模拟一下. 在这里, ...

  6. Nutch1.7学习笔记:基本环境搭建及使用

    Nutch1.7学习笔记:基本环境搭建及使用 作者:雨水,时间:2013-10-31博客地址:http://blog.csdn.net/gobitan 说明:Nutch有两个主版本1.x和2.x,它们 ...

  7. Django:学习笔记(1)——开发环境配置

    Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...

  8. python学习之python开发环境搭建

    Python简介 Python是一种面向对象.解释型计算机程序设计语言.Python语法简洁而清晰,具有丰富和强大的类库等等众多的特性,这是来自百度百科的介绍,在百度百科还能看到它的更详细的介绍信息, ...

  9. Scala学习1————scala开发环境搭建(windows 10)

    Scala开发环境搭建 先讲几点我学习scala的目的或者原因吧: JVM在企业中的霸主地位,Scala也是JVM上的语言,很有可能未来会从Java过度到Scala也不是不可能. 先进的函数式编程和面 ...

  10. php学习笔记1--开发环境搭建:apache+php+mysql

    php开发环境搭建:apache + php + mysql1.下载apache,php及mysql安装包2.安装apache:下载的apache若是.msi可直接双击,按指示一步一步安装:(若操作系 ...

随机推荐

  1. Visual Studio必备插件

    1.Rainbow Braces 2.Codist 3.ResXManager 4.XAML Styler for Visual Studio 2022 5.Viasfora 6.ZenCoding ...

  2. 【译】ASP.NET Core在 .NET Core 3.1 Preview 1中的更新

    .NET Core 3.1 Preview 1现在可用.此版本主要侧重于错误修复,但同时也包含一些新功能. 这是此版本的ASP.NET Core的新增功能: 对Razor components的部分类 ...

  3. 别再用 float 布局了,flex 才是未来!

    大家好,我是树哥! 前面一篇文章整体介绍了 CSS 的布局知识,其中说到 float 布局是 CSS 不断完善的副产物.而在 2023 年的今天,flex 这种布局方式才是未来!那么今天我们就来学习下 ...

  4. 「codeforces - 1394C」Boboniu and String

    link. 注意到 BN-string 长成什么样根本不重要,我们把它表述为 BN-pair \((x, y)\) 即可,两个 BN-strings 相似的充要条件即两者分别映射得到的 BN-pair ...

  5. Solution -「SP 106」BINSTIRL

    Description Link. 求 \(\begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2\) Solution 求 \[\begin{aligned} \begin ...

  6. mpi转以太网连接200plc通信不上实际问题和解决方法

    西门子S7200plc通信不上实际问题和解决方法 现场通信的同学在现场调试的时候,现在特别是做项目改造的项目,西门子S7200plc通信面临淘汰,但是在改造的项目中还能经常看到他们的身影,下面我们就来 ...

  7. 7 个 IntelliJ IDEA 必备插件,显著提升编码效率

    首先说一下idea引入外部插件的方式 用插件 1. FindBugs-IDEA 2. Maven Helper 3. VisualVM Launcher 4. GenerateAllSetter 5. ...

  8. Vue项目——尚品会

    1: 项目的初始化 环境要求:node + webpack + 淘宝镜像 初始化项目: vue create 项目名称 目录/文件分析: - node_modules文件夹:放置项目依赖的地方 - p ...

  9. win10系统单独编译和使用WebRTC的回声消除(AEC)、音频增益(AGC)、去噪(NS)模块

    一.简介 本人想单独编译并使用WebRTC的音频回声消除模块,奈何技术有限,于是在百度的海洋里大海捞针,发现了https://www.cnblogs.com/mod109/p/5827918.html ...

  10. Substring of Sorted String 题解

    Substring of Sorted String 写篇题解纪念一下蒟蒻第一次赛时切出的 F 题. 题目简述 对一个字符串进行单点修改,区间判断操作. 修改操作为将一个字符修改为另一个,判断操作为判 ...