Vulkan Playground: 使用 Visual Studio 2019 的 C++ 轻松入门 Vulkan
一个高级库,
引言
几年前我研究过 Vulkan 3D 图形 API。我遇到了臭名昭著的学习曲线,它结合了冗长的 API 和需要立即理解一些更复杂的概念,以及许多可能压倒大多数人的第三方辅助库。
令我惊讶的是,在我找到 Sascha Willems 出色的教程集之前,示例和教程非常少。事实上,它们太好了,我觉得这可能是为什么很少有人尝试编写类似教程的原因。无论如何,我决定完成基础示例,在创建用于抽象所有公共代码的辅助库的同时重写它们。
当时,我有一个整理代码并在这里发布文章的想法,但像许多想法一样,它被现实所取代。去年我有一些空闲时间,所以我重新审视了代码,整理了一下,并为示例添加了一些基本描述,这就是这篇文章。
什么是 Vulkan Playground
它是一个高级库,使得编写简单的着色器非常容易,并且还将 Vulkan 对象封装到 C++ 类中,这有助于了解 Vulkan API 各部分之间的交互。
它不是某种功能齐全的 3D 库或超级优化的生产级别代码。
要了解它的功能,最简单的方法是查看 Sascha 的基础集中的以下示例。原始示例很棒,因为所有代码都主要在一个文件中,但这对于初学者来说可能有点多。在这里,这些示例被分解为带有简单解释的子步骤。每个示例的代码量只有一两页,这使得很容易理解示例背后的高级思想。
运行示例
必备组件
- 安装最新的 Windows Vulkan SDK。
- 安装 Visual Studio 2019 社区版,确保选中 C++。
获取、构建和运行示例
运行 Visual Studio 2019,选择“克隆存储库” ①。然后输入位置“https://github.com/SuperflyJon/VulkanPlayground” ②,如果需要,更改路径,然后单击“克隆” ③。注意:您可能需要在 CMake 设置页面的“工具”->“选项”中设置名为“从不自动运行配置步骤”的选项,以阻止 Visual Studio 尝试对文件运行 cmake。
或者,手动克隆存储库,并打开 examples 子文件夹中的 Examples.sln 文件。
按 F5 或选择“调试”/“开始...”菜单选项之一来构建和运行示例。
10 分钟内绘制你的第一个三角形
首先,确保您拥有上面部分中的先决条件以及 Vulkan Playground 库代码,这些代码可以从上一节的示例或本文的 zip 文件中获取。
创建新项目
打开 Visual Studio 2019,在语言过滤器中选择“C++” ②,然后选择“控制台应用” ③,然后按“下一步” ④。
在下一个对话框中,输入一个名称,例如 MyTriangle
,以及一个存储文件的位置,然后按“创建”。
现在,通过将下拉菜单从“x86”更改为“x64” ①,将配置更改为 64 位。
从主菜单中选择“视图/其他窗口/属性管理器”以显示属性管理器窗口。在此窗口中右键单击 MyTriangle
项目,然后选择“添加现有属性表...” ②。
导航到 Vulkan Playground 库代码所在位置下的 Scripts 文件夹,然后选择 VulkanPlayground.props 文件。
现在用这段代码替换编辑器中的代码
#include <VulkanPlayground\Includes.h>
int main()
{
class HelloWorldApp : public VulkanApplication {
void UpdateScene(VulkanSystem& system, float ) override {
PrintString(10, 50, U"Hello, World!");
}
} app;
WindowSystem::RunWindowed(200, 100, "Hello World!", app);
}
如果尝试构建此代码,代码应该可以编译,但会抱怨未解析的外部符号,我们现在将添加来自 Vulkan Playground 库的代码。
添加 Vulkan Playground 库
从主菜单中选择“文件/添加/现有项目...”。导航到 Vulkan Playground 源位置,然后从 VulkanPlaygroundLibrary 文件夹中选择 VulkanPlayground.vcxproj 项目文件。
现在您需要链接到该库。右键单击三角形项目下的“引用”项,然后选择“添加引用...” ①,单击 Vulkan Playground 旁边的复选框 ②,然后单击 Ok ③。
现在按 F5 构建并运行此测试,您应该会看到一个带有“Hello world!”的窗口。
渲染一个三角形
现在您知道一切正常,请用以下代码替换测试代码,这将绘制一个三角形。
#include <VulkanPlayground\Includes.h>
int main()
{
class TriangleApp : public VulkanApplication
{
void SetupObjects(VulkanSystem& system, RenderPass& renderPass,
VkExtent2D workingExtent) override
{
pipeline.LoadShader(system, "Triangle");
pipeline.SetupVertexDescription({ {1, Attribs::Type::Position,
VK_FORMAT_R32G32_SFLOAT} });
CreatePipeline(system, renderPass, pipeline, workingExtent, "TriangleSimple");
system.CreateGpuBuffer<float>(system, vertexBuffer,
{ -.8f, 0.8f, 0.8f, 0.8f, 0.0f, -.8f },
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, "Triangle data");
}
void DrawScene(VkCommandBuffer commandBuffer) override
{
pipeline.Bind(commandBuffer);
vertexBuffer.Bind(commandBuffer);
vkCmdDraw(commandBuffer,
(uint32_t)vertexBuffer.GetBufferSize() / pipeline.GetStride(), 1, 0, 0);
}
Pipeline pipeline;
Buffer vertexBuffer;
} app;
WindowSystem::RunWindowed(300, 200, "Triangle", app);
}
这段代码相当直接,SetupObject()
首先加载 Triangle 着色器文件(我们稍后会创建)。然后示例设置一个需要成对 float
值才能传递的管道,数据在此示例中是硬编码的。DrawScene()
绑定管道和缓冲区,并调用 Vulkan 命令 vkCmdDraw
来绘制三角形。
现在添加着色器文件。在解决方案资源管理器中右键单击 MyTriangle
项目,然后选择“添加/新建项...” ①。在名称框中将“Source.cpp”替换为“Triangle.vert”,然后单击“添加”。
将以下简单的顶点着色器代码粘贴到编辑器中
#version 450
layout(location = 1) in vec2 inPosition;
void main()
{
gl_Position = vec4(inPosition, 0.0, 1.0);
}
重复这些步骤添加另一个名为 Triangle.frag 的文件,并将以下代码粘贴到该文件中
#version 450
layout(location = 0) out vec4 outFragColour; // 0 = colour attachment number
void main()
{
outFragColour = vec4(vec3(0.8), 1.0);
}
再次运行项目(F5),您应该能看到您的第一个 Vulkan 三角形。
如果您运行的是调试版本,您应该会在控制台窗口中看到大量输出,提示一些幕后工作。
2 分钟内绘制你的第一个三角形
如果您在按照上述说明操作时遇到困难,源代码下载中有一个示例项目,只需打开 Example\Triangle 文件夹中的 Triangle.sln 文件,然后单击运行,您应该能看到一个三角形。
您可以使用这个简单的三角形示例作为创建自己的 Vulkan 示例的起点。
链接
正在使用一些第三方库,详细信息请参阅外部文件夹中的外部 details.txt 文件。
如果您想深入了解细节,这里有一个深入的 Vulkan API 入门教程:here。
Sacha 的完整示例集在此处:here,尽管看起来他正在迁移到这个较新的 Vulkan 示例通用位置:github.com/KhronosGroup/Vulkan-Samples.
历史
- 2021年1月17日:初始版本