Vulkan Tutorial, but Ricardo2001zg!

前言

1
It has taken a lot of work to get to this point, but now you finally have a good base for a Vulkan program. The knowledge of the basic principles of Vulkan that you now possess should be sufficient to start exploring more of the features

—— 节选自 Vulkan Tutorial - Multisampling

从六月份起的引擎面试结束,我又回归了校园生活,并计划从《Vulkan Tutorial》开始,在自己的引擎旅途上启航。

经历了四个半月断断续续的学习,终于根据示例代码指导,完整地实现了教程里面的模型渲染展示,在此特向在数月里给予指导、支持和鼓励的 饼叔(微博@杨林)、董大师、晶晶 与 Meta@Homomniverse 社群等的各位前辈表示感谢,并在此进行一些简要分享。

所有实践代码均发布于 Github/Ricardo2001zg/DongTianEngine, 截至至本文时的 commit 版本为 281bd76

本文首发于 影疏弦断 - Vulkan Tutorial, but Ricardo2001zg!,开放转载授权,转载与使用请保留出处。

技术背景与导读

在开始学习这个教程的时候,我的渲染水平基本为

  1. DX11龙书中文版 简要阅读过;
  2. GAMES101 已经学习 Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping);
  3. 阅读过《3D游戏编程大师技巧》的上册,对渲染流程有基础了解;
  4. 没有学习过 GAMES104

学习该教程的过程中,深刻体会了该教程的冗长与繁杂,但是全流程概述确实如此。对此,我建议阅读该教程的读者,可以自行对教程的每一章节进行拆分与原理思考,降低学习难度。同时建议与其他图形 API 教程进行交叉阅读,并以 GAMES 101 和 104 作为学习辅助。

该教程以 Vulkan API 的实用教学为主,没有过多涉及渲染原理,仅适用于已有图形渲染基础的读者,同时建议有操作系统的相关基础后再进行学习。过早阅读可能会导致读者在如朋友圈等社交空间的间歇性发病 :D

特别提醒:绘制三角形需要近千行代码,占据该教程约三分之一的阅读量,请耐心学习。

教程总览

该教程以基础的三角形绘制出发,讲解了从物理设备设置到渲染管线基础设置的全流程。并在三角形绘制完成后进行各类缓冲区的设置教学,并以模型加载、纹理映射、多级渐进纹理(Mipmaps)、多重采样等功能的实现作为教程进阶,完成一个模型基于 Vulkan 的基本绘制。

全教程的示例代码量约在 2000 行,其中,绘制三角形的基础代码量为 1000 行,该教程需要大量耐心与少量渲染基础,用于理解 Vulkan 中的大量功能设置。

对于教程内需要的 着色器、模型文件、纹理贴图 等数据文件,教程内均有提供,请仔细阅读教程。

分部导读

分部导读 1 - 基础设置

基础设置部分主要位于 Drawing a triangle 章节的 Setup 部分与 Presentation 部分。

Setup 部分主要进行的工作是 项目环境、验证层、物理与逻辑设备配置。项目环境直接参考教程内推荐即可。验证层、物理与逻辑设备配置 均以 Vulkan 内的 C++ 调用而实现。强烈建议完成验证层设置 用于调试与排错。

物理与逻辑配置均仅完成基础功能,教程后续将会进行陆续填充,填充时根据功能完善代码,建议填充时详细了解 特定选项 对应的 渲染阶段的特定功能物理或逻辑设备提供的特性

Presentation 部分主要进行的工作是基于 GLFW 库的桌面软件框架配置,用于呈现所位置图像。

分部导读 2 - 渲染管线

Drawing a triangle 章节的 Graphics pipeline basics 部分主要进行的工作是渲染管线设置,**强烈建议经常性翻阅 Introduction 中的简要概述图片(simplified overview)**。该流程图片展示了渲染管线的基础工作流程,有助于理解各类选项的用法。

同时特别提醒,Fixed functions 章节的填充内容略多于其他章节,可酌情分块阅读,并理解各结构体的填充含义。

分部导读 3 - 绘制与呈现

Drawing 与 Swap chain recreation 部分完成的是具体的绘制功能与呈现。

其中,在 Drawing 部分中会涉及帧缓冲区(Frame Buffer)与命令缓冲区(Command Buffer)的设置,其他缓冲区的设置将在后续章节中涉及。

除 Drawing 部分外的其余部分,基本以帧的呈现为主,将绘制画面显示在屏幕上。

自此,读者已有在窗口上绘制单个三角形并进行渐变着色的能力。

简要提醒:三角形的重绘默认不限速,可能在笔记本类设备上会大幅度提高核显使用率,可不必担心是否成功调用独立显卡。验证是否使用独立显卡可通过 在主循环中添加等待时间输出物理设备的名称(通过 physicalDevice 查询) 两种方法。

分部导读 4 - 缓冲区实现

本章导读横跨 Vertex buffers、Uniform buffers 等多个缓冲区部分。包括 Frame Buffer 与 Command Buffer 在内,该教程指导了 帧、命令、顶点、统一、深度 等五类缓冲区的实现,并指导读者在具体渲染操作中使用上述缓冲区。以上缓冲区的实现章节中,均包含了各类缓冲区的优化手段,例如顶点缓冲区中的索引缓冲区等,读者可自行深入了解。

分部导读 5 - 模型与纹理

该导读涉及后续所有章节,最终完成了一个模型包含贴图在内的基础渲染。

Loading models 部分完成了一个 Obj 模型的读取,并将指定贴图映射到模型上。该部分是本教程所指导的最终渲染结果,后续仅包含部分优化。

Mipmap 部分为多级渐进纹理的特性开发,实现了贴图的多级渐进。

Multisampling 部分是教程的最后一章,本章涉及到了硬件特性使用,基于硬件所提供的特性,实现了多重采样功能。

分部导读 6 - 尾声

自此,读者掌握的 Vulkan 基本原理应该足以开始探索更多功能。

1
原文: The knowledge of the basic principles of Vulkan that you now possess should be sufficient to start exploring more of the features

后记

虽然完成了该教程的学习,但我认为我的计算机图形学基础仍然有待完善,渲染的基础原理还是掌握得较为不熟练,准备再花费一点时间巩固。

但是,经历了 Vulkan Tutorial 的学习,至少可以说是在图形学的门槛边上,完成了一次眺望。接下来我可能还会去学习 GAMES104 的课程,完成从 2000 行代码到 20000 行代码的飞跃,希望这篇简短的文章能够给教程的其他读者给予一些帮助。

再次感谢学习路上的各位前辈给予的帮助与鼓励。

Arch Linux for RicsLaptop

前言

经过了漫长的考虑和选择过程,终于决定把主力 Linux 环境从 Debian 迁移到 Arch Linux 上了。

系统环境

目标环境:

版本 Arch Linux (Lastest version)

软件环境

驱动环境

Nvidia Driver

Intel Graphic Driver

桌面环境

KDE(Wayland)

开发环境

VS Code

Github Desktop

Python

Flutter

Java JDK

Android SDK

Jetbrains (IDEA, PyCharm, DataGrip)

Vulkan

cmake

clang

g++

工具环境(常用)

7zip

Krita

Blender

WPS Office

Feishu

工具环境(性能优化)

Optick

RenderDoc

Intel VTune

NVIDIA Nsight Systems

NVIDIA Nsight Graphic

日常环境

Chrome

VLC

游戏环境

Steam

安装流程

最小化安装

此处参考 ArchLinux Wiki 中的 Installation guide (简体中文)

后续安装

ArchLinux Wiki 太详细了,抄都不用抄了,对着装就行。

基本上就是 NVIDIA 专有驱动 -> KDE -> Chrome -> 看着 Wiki 和本列表装其他软件。

整了个记录脚本出来,请不要真的执行它。

Downloads: ricslaptop_install.sh

更新 2022-10-23 08:52:32

经过一段时间的测试,现在可以正式执行多系统跨平台开发的庞大计划。系统整体基于 Arch Linux,并搭载 qemu/kvm 虚拟机,对 Windows、Linux、MacOS 进行虚拟化模拟。(MacOS 虚拟化具有潜在法律问题,本文仅供学习使用,请勿用于生产环境)

[x]TODO: 1. Intel 9560 passthrough

参考资料:PCI_passthrough_via_OVMF_(简体中文)

[x]TODO: 2. Host virtual network

参考资料:Linux虚拟网络设备之bridge(桥)

[x]TODO: 3. Host SSH and NetWork Settings

[x]TODO: 4. Win11Work Settings

[x]TODO: 5. WinServer2022 Router(NAT)

设置完 NAT 服务以后记得设置 DNS 服务器,不然配置出来的网络也是挂的。

参考资料: 事件 407 和 408 在 DNS 服务器事件日志中报告

无法连接套接字 警告可忽略,Linux端的网桥配置好网关即可(KDE 的 network manager 设置网关通过设置 ip route 生效)

[x]TODO: 6. OSX-KVM

[ ]TODO: 7. NVIDIA passthrough

[ ]TODO: 7. Intel GVT-d(passthrough)

需要导出 VBIOS 中的 GOP 驱动并在 kvm 中加载。

Ric的考研计划

如题,卷来卷去又卷回这条道路上了,既然决定去卷就开干。其实在这之前就有想法了,但是一直没下定决心,最后引擎 offer 让我决定去把考研卷了。

其实从标签里可以看出方向和目标都是很明确的,图形学实时渲染方向与性能分析方向的交叉领域,游戏优化方向。因此研究方向为图形学、体系架构或高性能计算,结合在西山居今年的性能优化与明年实习的 Vulkan 开发经历,大概率会选择图形学或体系架构方向。

初试报考时间为 2023年9月

招生信息整理

根据《清华大学2022年硕士研究生招生专业目录_统考(含招生人数)》参考,2022 年 Thu 计科统考招生信息如下:

024 计算机科学与技术系

招生计划: 12

081200 (学术学位) 计算机科学与技术
01(全日制)计算机系统结构
02(全日制)计算机软件与理论
03(全日制)计算机应用技术
考试科目
①101 思想政治理论
②201 英语(一)
③301 数学(一)
④912 计算机专业基础综合
912 计算机专业基础综合
数据结构(70 分)
计算机原理(30 分)
操作系统(30分)
计算机网络(20 分)

22年考研时间线(资料来源: 清华研招网)

时间 事项
2021年八月-九月 公布硕士招生简章、普通招考招生目录
2021年八月-九月 公布普通招考硕士招生相关事宜须知
2021年十月 公布硕士普通招考招生目录(含招生人数)
2022年二月-三月 开通全国硕士研究生招生考试初试成绩查询和复查
2022年二月-三月 公布全国硕士研究生招生考试复试录取办法、复试基本分数线
2022年四月-五月 普通招考硕士拟录取名单公示
2022年四月-五月 拟录取研究生校核拟录取库
2022年四月-五月 拟录取研究生入学前准备,资格复审
2022年四月-五月 拟录取研究生发放录取通知书

学科备考

总体方向

1、深入理解各学科知识点原理与背景,理论与实践相结合

2、需要做到判断和选择题的考点换成问答题一样会写

感谢各位前辈分享的考研经验。

政治

(计划学习参考用,整理自往届前辈经验)

徐涛全程班

徐涛的强化班和刷题班,根据要求背了相应部分的《核心考案》

肖秀荣团队的《精讲精练》、《1000题》、《讲真题》

肖秀荣团队的《八套卷》、《四套卷》(精做+背诵)

英语

2022.06.15

优先考过四六级(基础),目前用的是扇贝背四级。

(计划学习参考用,整理自往届前辈经验)

注:考研英语的关键在阅读,因为阅读题材几乎固定不变,所以真题的价值非常高。

张剑的《考研英语真题黄皮书》

王江涛的《考研英语高分写作》(作文模板整理与写作练习)

唐迟的阅读视频,阅读逻辑

王江涛、刘晓艳和朱伟的写作班

王江涛老师提倡熟记优秀范文,而且他也出版了一些含有优秀范文的资料。刘晓艳老师善于讲授自由度很高的“万能写作模板”。朱伟老师则是提供了一些十分高端华丽的表达方式。

数学

2022.06.15

目前计划见后文。

(计划学习参考用,整理自往届前辈经验)

李永乐复习全书和张宇1000题和十年真题

《数学复习全书》(李范全书2018年版)(阅读+少量练习)

汤家凤的《考研数学历年真题全解析》 (2000-2019年真题精做)

张八、张四和李林六套卷

912

就这几门课,学就是了,都不用选。

其他参考资料

1.stellarkey/912_project

2.PKUanonym/REKCARC-TSC-UHT

个人计划

此段完全根据个人情况进行整理,仅供参考。

2022.06.15

根据上述的方向规划,结合本人的实际情况,计划在两个月内完成 微积分A(1)、线性代数(1)、程序设计基础、离散数学(1)、计算机图形学基础。

本人目前水平为今年广东专插本刚刚民办过线,专科院校广东科学技术职业学院,准备读大三,手上有西山居的offer和一年经验。

除了离散以外,本人的数学水平大概在广东专升本刚过线的程度,专插本用的是 王光庆高等数学(考Thu的应该没有比这基础还差了的吧,从零开始应该也是有参考价值的2333),稍微读过一点朱健民老师的高等数学,但是那本不太适合本人与零基础同学,老师讲课不错,但课本基础跃度有点大,适合进阶。

程序设计基础仅作为参考,使用洛谷 - 题单广场做题练习,本人水平目前大概是noip普及2=往下一点的程度,算比较差,但是总体框架认知还是有的,再加上 C++ Primer Plus(第五版) 做语法补充,准备在重学面向对象的时候学C++ 11。

计算机图形学虽然我也菜,但是也没这么菜,目前已把 GAMES101 的 Lecture 8 学完,计划重学。在学习的过程中,在 Linux 上搓 Vulkan,Windows 上搓 Vulkan + DX12,因为手上拿着西山居引擎明年6月的offer,每月要给总监导师们交作业2333。

再写多一点怕压力太大,先这样试试,反正没有二战三战压力,一战挂了就工作慢慢考。

2022.07.05

待续。

Timeline

2022.06.15 正式写下考研计划,初步整理方向

Games101 Lecture 07 Shading 1 (Illumination, Shading and Graphics Pipeline) 笔记

Painter’s Algorithm: 从远到近绘制,覆盖所画物体

Z-Buffer: 离视点越近值越小(黑),越远值越大(白)

实现: 遍历三角形,随后遍历三角形内每个像素,若小于深度缓存值,更新像素信息,并更新深度缓存(仅适用于非透明物体)

Shading(in this course): The process of applying a material to an object.(着色与材质一起讲)

Specular highlights: 高光

Diffuse reflection: 漫反射

Ambient lighting: 环境光(一般为常量)

Blinn-Phong Reflectance Model: 见视频

Lambert’s cosine law: cos = l * n(光线方向与法线方向的乘积与其余弦值成正比)

光照强度与传播距离成平方反比

Lambertian (Diffuse) Shading: LaTex没学,在这里暂时不写公式了

Games101 Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering) 笔记

Video = Sample Time

Moire Patterns: 看图

Sample Artifacts: Jaggies, Moire, Wagon wheel effect, etc.

本质: Signals are changing too fast (high frequency), but sampled too slowly

High-frequency signal is insufficiently sampled: samples erroneously appear to be from a low-frequency signal.

Aliases(混叠): Two frequencies that are indistinguishable at a given sampling are called “aliases”

Filtering: 过滤一系列指定频率

High-pass filter(高通滤波): 保留高频信息,图像上显示为保留边界轮廓

Low-pass filter: 图像上显示为图像模糊(去除边界)

Filtering = Convolution(卷积) = Averaging

(到这里听傻了,没想到第一次听到卷积简化实现是在图形学课程)

结论: 时域卷积 = 频域乘积(时域乘积 = 频域卷积)

频率角度: Sampling = Repeating Frequency Contents(课程内有简单的原理解释)

Aliases 的信号角度: 采样速度较慢导致的频谱重复时的混叠

抗锯齿实现原理: 模糊(卷积,去掉高频信号)后采样 Convolve then sample

MSAA 原理: 在像素内部提高采样数

FXAA (Fast Approximate AA): 找到锯齿图像边界,后处理

TAA (Temporal AA): 复用上一帧结果,静止效果好

Super resolution / super sampling:

DLSS (Deep Learning Super Sampling)

(到最后其实还是没有时间讲 Z-Buffering 的事情2333)

Games101 Lecture 5 Rasterization 1 (Triangles) 笔记

FOV: field-of-view

Aspect ratio = width / height

视锥体定义(近平面):FOV 与宽高比定义

Screen(程序定义): 二维数组,每个元素代表一个像素

Screen Space: 课程以左下角为原点,实际由 API 确定

Canonical Cube to Screen: 视口变换,MVP 后转换至屏幕空间,变换矩阵见视频

成像设备(Display)专场:

Cathode Ray Tube(CRT): 熟悉的技术

Liquid Crystal Display(LCD)

其他的算科普,看看视频就行

Triangles: 优点很多,有许多不错的性质,看视频

Sampling: 采样,将函数离散化

染色:叉积计算像素中心是否在三角形内确定是否染色

Bounding Box: (优化)包围盒确定屏幕空间下三角形需要计算像素中心的范围

Axis-Aligned Bounding Box: 轴向包围盒

优化(?): 像扫描线一样一行一行判断

液晶的排列形式: 简单补充一下,见视频

三原色与三基色的区别

Aliasing(Jaggies): 走样(锯齿), 下节课

Games101 Lecture 4 Transformation Cont. 笔记

2022-05-11

昨天练了一晚上dps循环,没睡好头疼了一天,欠一节课

2022-05-12

今天没睡好,又欠一节

2022-05-13

写文章去了,再欠

2022-05-14

正交矩阵:矩阵的逆等于矩阵的转置,称为正交矩阵

Viewing transformation

  • View / Camera transformation
  • Projection transformation

Rotation around x-, y- or z-axis

三个轴的旋转矩阵,见视频

Often used in flight simulators: roll, pitch, yaw

以前没有注意到,其实飞行模拟实现就是这样

Rodrigues’ Rotation Formula,推导不太熟,课后学习下

MVP transformation - model /view / projection

View transformation 实践:

根据相机的位置、朝向、向上方向,先写出原始的由原点变换至相机位置的矩阵,随后转置,可得出将相机与其他模型转换到以相机为原点的坐标系的矩阵。

原理:旋转矩阵是正交矩阵。旋转矩阵的逆矩阵是逆向变换的矩阵,正交矩阵的逆等于转置

Perspective projection: 道理我都懂,为啥鸽子这么大

视频内有正交与透视投影的图像示意,看了图终于搞懂了

Model transformation 实践:

Orthographic Projection:

把Z轴扔掉(╯‵□′)╯︵┻━┻(想了想还真是这么回事)

正式做法:Canonical cube

Perspective Projection:

原理:远平面缩放至近平面的比例(相似),随后正交投影

实践:y’ = (n/z)*y (n和z的比值缩放三维坐标)

投影矩阵计算见视频,为节省计算量,计算矩阵时需要用n与f凑出该矩阵,避免使用xyz

Games101 Class3 Transformation 笔记

课程地址: https://www.bilibili.com/video/BV1X7411F744?p=3

主要是记概念,并增加点外部知识,实操请看视频

Why:运动、缩放、旋转、成像均与变换相关

How:通过对应关系(矩阵计算)进行变换,各类矩阵不再赘述(笔者偷偷用白纸默写各类矩阵了(雾))

普通平移操作不属于线性变换(需要矩阵相加)

齐次坐标:在图形学中将平移变换统一至矩阵运算中

平移变换统一:通过升维引入齐次坐标将平移统一至矩阵运算中,在保证平移不变性的同时下统一点与向量运算

仿射变换:上述操作用齐次坐标表示,此类表示仅限于仿射变换(后续有投影变换)

逆变换:逆矩阵

组合变换:旋转以原点为中心,顺序影响最终效果(矩阵乘法不满足交换律)

复习:不用齐次坐标表示,即为先线性变换,后平移