一、概述

最近因为工作需要开始学习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_PATHVULKAN_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.hppglm/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. 2023年了,复习了一下spring boot配置使用mongodb

    前言 MongoDB是一个基于分布式文件存储的开源数据库系统,使用C++语言编写.它是一个介于关系数据库和非关系数据库之间的产品,具有类似关系数据库的功能,但又有一些非关系数据库的特点.MongoDB ...

  2. 关于初次new springboot项目

    如果是新手初学,然后做springboot项目报各种错,改来改去最终都无法出现successful字样. 请先检查,maven环境是否配好. maven环境决定你下载依赖的速度,以及能否下载成功. m ...

  3. Codechef - Longest AND Subarray(位运算)

    题目大意   给定一个正整数N,其序列为[1, 2, 3, ..., N],找到一个长度最大的连续子列,使得其所有元素取与运算的结果为正(最终输出只需要输出最大长度即可). 思路   刚开始可能并不好 ...

  4. ReactPortals传送门

    ReactPortals传送门 React Portals提供了一种将子节点渲染到父组件以外的DOM节点的解决方案,即允许将JSX作为children渲染至DOM的不同部分,最常见用例是子组件需要从视 ...

  5. Java 21 新特性:Unnamed Classes and Instance Main Methods

    Java 21引入了两个语言核心功能: 未命名的Java类你说 新的启动协议:该协议允许更简单地运行Java类,并且无需太多样板 下面一起来看个例子.通常,我们初学Java的时候,都会写类似下面这样的 ...

  6. CF1294C

    题目简化和分析: 使得 \(a \times b\times c=n~~~~(a\ne b\ne c)\) 思路: 先枚举最小的 \(a\) ,(以下程序的返回值为最小因数(有部分优化),即 \(a\ ...

  7. VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)

    账号秘密都对,但是缺登录不成功的问题 诀窍可能是: 在属性设置中把LeetCode版本改成cn.点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可. 大 ...

  8. 人工智能AI浪潮的掀起,打工人何去何从?

    感谢你阅读本文 自从2022年11月30日OpenAI公司推出了ChatGPT,至今一年了,而这一年国内也发生了天翻地覆的变化,各大厂商纷纷推出了自己的大模型和解决方案,例如百度的文心一言,阿里的通义 ...

  9. 动态规划的状态设计 | bot 讲课の补题

    sto james1badcreeper orz. 好厉害的题,但是怎么有人补了三天才补完呢? CF1810G The Maximum Prefix 线性 dp,怎么有 bot 说题目难度在 *240 ...

  10. Python 轻松生成PDF文档

    PDF(Portable Document Format)是一种常用的文档格式,具有跨平台兼容性.保真性.安全性和交互性等特点.我们日常生活工作中的合同.报告.论文等通常都采用PDF格式,以确保文档在 ...