摘要: 队列 队列的定义 队列是只能在队头出队(dequeue),只能在队尾入队(enqueue)的表。 队列的实现 链表实现 链表队列的定义 typedef struct Node { int m_Data; struct Node* m_Next; }Node; typedef struct Queue 阅读全文
posted @ 2025-10-13 23:59 单身喵 阅读(9) 评论(0) 推荐(0)
摘要: 树 树的定义 有且只有一个根节点。 有若干个互不相交的子树,这些子树本身也是一棵树。 树的分类 一般树: 任意一个节点的子节点的个数不受限制。 二叉树: 任意一个节点的子节点不超过两个。 一般二叉树 满二叉树:每一层上的节点数都是最大节点数。 完全二叉树:删除满二叉树最底层最右边的连续若干个节点后形 阅读全文
posted @ 2025-10-13 23:59 单身喵 阅读(12) 评论(0) 推荐(0)
摘要: 衡量算法的标准 一、时间复杂度 程序大概要执行的次数,而非时间。 二、空间复杂度 算法执行过程中大概所占用的最大内存。 三、难易程度 四、健壮性 阅读全文
posted @ 2025-10-13 23:58 单身喵 阅读(2) 评论(0) 推荐(0)
摘要: Unity URP 体积云 ​ 好久之前开的体积云,因为期末考试和过年拖了很久,这几天才算整完。记录一样实现的思路,方便日后忘记了回来复习。 ​ 云的渲染有多种实现方法,我实现的是基于RayMarching的体积云体渲染,也就是将云视为孤立的元素,光线经过云这种介质之后发生作用进入人眼,由于云不会自 阅读全文
posted @ 2025-10-13 23:56 单身喵 阅读(54) 评论(0) 推荐(0)
摘要: MVP变换 把三维空间中的物体投影到二维平面上展示,需要经过MVP变换,MVP变换指的是:模型变换(model)、视图变换(view)、投影变换(projection)。模型变换指的是物体的缩放、平移、旋转等变换,视图变换 主要指如何确立相机位置, 投影变换,就是最后最重要的一步,把三维图形投影到二 阅读全文
posted @ 2025-10-13 23:55 单身喵 阅读(9) 评论(0) 推荐(0)
摘要: Ray Tracing Light Rays 光线的定义: 光线沿直线传播,不考虑波动性。 光线之间不发生碰撞。 光线从光源发出,经过吸收、散射进入到人眼,但光路可逆。 Ray Casting(光线投射) 从摄像机对屏幕中的每一个像素链接一条线,打出一根光线,判断该光线是否与物体相交。 若相交,选取 阅读全文
posted @ 2025-10-13 23:55 单身喵 阅读(9) 评论(0) 推荐(0)
摘要: Untiy SRP 屏幕空间反射(SSR) ​ 前段时间在Unity中使用SRP实现了屏幕空间反射,同时尝试使用Unity内置的RenderGraph来管理渲染管线,项目的主要框架是基于该教程Unity Custom SRP,记录一下实现的过程方便后面要使用的时候复习。 后处理准备 创建后处理设置及 阅读全文
posted @ 2025-10-13 23:55 单身喵 阅读(21) 评论(0) 推荐(0)
摘要: 光栅化 Rasterrization—光栅化(三角形的离散化) 屏幕(Screen)在图形学我们可以被抽象为一个二维数组,其中二维数组中的每个元素是像素( pixel )。 屏幕空间(screen space)是由数组构成的平面坐标系,每一个像素用坐标表示,像素的中心在x+0.5和y+0.5上。 为 阅读全文
posted @ 2025-10-13 23:54 单身喵 阅读(23) 评论(0) 推荐(0)
摘要: 图形学中的变换 二维变换 缩放变换(Scale) 如上图,如果想把一个图形缩小为原来的0.5倍,那么就需要x坐标变为0.5倍,y坐标也变为0.5倍,可以用以下表达式表示 这两个表达式可以用矩阵的形式表示如下 Sx表示在x轴方向上缩放的倍数,Sy表示在y轴方向上缩放的倍数 反射变换(Reflectio 阅读全文
posted @ 2025-10-13 23:54 单身喵 阅读(23) 评论(0) 推荐(0)
摘要: 线性代数 向量 向量的基本概念 向量通常用\(\vec{a}\)或a表示,或使用起始点和终点表示\(\overrightarrow{AB}\) = B - A。 向量的长度写作\(\lVert\vec{a}\rVert\),单位向量表示为\(\hat{a}\) = \(\vec{a}\) / \(\ 阅读全文
posted @ 2025-10-13 23:54 单身喵 阅读(18) 评论(0) 推荐(0)
摘要: 着色(Shading) Blinn-Phong 反射模型(Blinn-Phong Reflectance Model) Blinn-Phong 反射模型将光分为三种: 反射高光(Specular Highlights)。 漫反射(Diffuse Reflection)。 环境光(Ambient Li 阅读全文
posted @ 2025-10-13 23:54 单身喵 阅读(7) 评论(0) 推荐(0)
摘要: 作业八 离完成101系列已经过了好几周了,中间的笔记也只写到光栅化之前,马上考完试打算把搁下来的笔记和作业实现细节给写一写,打算从作业八开始从后往前记录,笔记也相同,顺便复习一下快忘掉的知识。 环境搭建 由于虚拟机很卡,而且不知道怎么复制,不方便记录,因此我在作业五之后便舍弃虚拟机,使用vs编写。环 阅读全文
posted @ 2025-10-13 23:54 单身喵 阅读(7) 评论(0) 推荐(0)
摘要: Real-Time Shadows Shadow Mapping Shadow Mapping的算法 使用两趟Pass 第一趟Pass从光源所在的地方看向场景,并输出一个阴影贴图,来记录场景中最近的深度。 第二趟Pass使用第一趟渲染出的阴影贴图通过比较当前像素的深度与记录的深度来判断看到的物体是否 阅读全文
posted @ 2025-10-13 23:53 单身喵 阅读(13) 评论(0) 推荐(0)
摘要: DirectX RayTracing (1) : 绘制第一个三角形 ​ 有好一段时间没写文了,暑假前疯狂找实现,结果大败而归,道心破碎,狠狠的摆烂了一个暑假,上一篇 SSR 也是写到一半就搁置了,开学后才重新拾起来。最近准备学学 DXR ,因此把学习过程写下来记录一下。 ​ 我是通过直接阅读微软官方 阅读全文
posted @ 2025-10-13 23:53 单身喵 阅读(10) 评论(0) 推荐(0)
摘要: DirectX RayTracing (2) 简易的3D场景及光照 ​ 该文章基于上一篇对 DX12 光追管线的基础介绍,若是没看过可以去看看。有了基本的光追框架,在其基础上实现各种功能就简单了许多。这次的目的是实现 3D 物体的绘制及简单的光照。接下来便列出需要修改的地方及对应的原理。 资源的绑定 阅读全文
posted @ 2025-10-13 23:52 单身喵 阅读(11) 评论(0) 推荐(0)
摘要: 编写DX12时使用的辅助类 有一段时间没有学DX12,导致很多东西都忘了,跟着教程里写的东西还好,略看一遍教程就想起来的,但是自己封装的很多类就算写了注释过了一段时间也基本忘光,而且翻来翻去的也不方便,为了快速记起来写一下实现思路。 Singleton 简介 需要进行显式初始化,并且可控制生命周期的 阅读全文
posted @ 2025-10-13 23:51 单身喵 阅读(6) 评论(0) 推荐(0)
摘要: 在DX12中使用DDSLoader和StbImage加载纹理 ​ 前几天学了一下在DX12中加载并绑定纹理,以免之后忘了记录一下是怎么加载的。 使用DDSTextureLoader12加载DDS纹理 ​ DDS是一种专门为GPU设计的纹理格式,因此在使用纹理之前建议将纹理转化为DDS格式,而且DDS 阅读全文
posted @ 2025-10-13 23:51 单身喵 阅读(10) 评论(0) 推荐(0)
摘要: 着色器和相关资源的创建 QG-Homework/小组作业/第一周 at main · wsdanshenmiao/QG-Homework (github.com) 编写着色器代码 首先是编写处理各种效果的HLSL代码 //顶点着色器 VertexOut VS(VertexIn vIn) { Vert 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(3) 评论(0) 推荐(0)
摘要: 在DX12中管理资源的分配 ​ 这几天对着MiniEngine学了一下对DX12底层接口的封装及各种资源的管理,同时也自己试着封装了一下代表显存资源的ID3D12Resource,并对其的分配进行管理。要对资源进行管理首先就需要知道要如何创建这个资源,该接口所表示的资源由设备ID3D12Device 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(11) 评论(0) 推荐(0)
摘要: 在DirectX11使用imGui 生成imGui静态库 在GitHub上克隆imGui项目后,在文件夹中单独挑出imGui的核心代码 随后根据自己所使用的图形API和平台在backends文件夹中挑出需要的文件,这里选择这四个。 在自己需要使用imGui的项目内再创建一个项目,放入以上文件,再打开 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(33) 评论(0) 推荐(0)
摘要: 使用曲面细分绘制甜甜圈 构造圆环的思路 一开始想着使用贝塞尔曲面,通过调整控制点直接成环,或是先卷成圆柱再成环,后面想着使用贝塞尔曲面过于麻烦,且通过操纵控制点来变换不如直接变换平面直观,因此决定先构造一个平面,再卷成圆柱后成环。 构造平面 由于输入控制点外壳着色器的控制点数量与输出的数量可以不相同 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(10) 评论(0) 推荐(0)
摘要: 使用DX12绘制几何体 顶点与索引 图元类型 要描述一个几何体,可以使用顶点加索引的方式来描述,每一个顶点中储存了一定的数据,而索引来描述如何连接这些顶点,而索引加上图元类型又决定了如何组装所有的顶点。在Directx中有如下图元类型: D3D_PRIMITIVE_TOPOLOGY_UNDEFINE 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(7) 评论(0) 推荐(0)
摘要: 使用DirectX实现纹理绘制 初始化纹理 首先是创建矩形,这里使用X_Jun教程中提供的Geometry.h中的Geometry::CreateBox方法: auto meshData = Geometry::CreateBox<VertexPosNormalTex>(3, 3, 3, XMFLO 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(9) 评论(0) 推荐(0)
摘要: 使用DirectX时的一些疑难杂症 X5589 Invalid const register num: 155. Max allowed is 31 这是由于使用的常量寄存器超出了限制,不同的着色器模型支持的数量不同,这时提高着色器模型即可。 寄存器类型、数字和子组件声明。 类型 注册说明 b 常量 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(5) 评论(0) 推荐(0)
摘要: 使用DirectX绘制天空盒并实现破坏和放置方块 绘制天空盒 由于项目中的DxTex软件使用不了,所以直接使用了方法二,将项目中的文件名直接修改,不过这里要注意获取的六个正方形贴图要用正确的顺序读取,也就是+X,-X,+Y,-Y,+Z,-Z。 这里我是用了如下网址制作贴图:Panorama to C 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(4) 评论(0) 推荐(0)
摘要: 编写DX12程序遇到的坑 ​ 写DX12每次遇到Bug都会卡好久,结果大部分时候最后都发现是一些小问题导致的,故将自己遇到的坑都写下来,方便后续遇到时回头查阅。 使用ClearDepthStencil清理DepthBuffer的时候把其他资源也清理了 ​ 抄MiniEngine对API的封装的时候想 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(5) 评论(0) 推荐(0)
摘要: 语义 语义的概念 语义xxxx:+ 大写单词,是用来限定输入值的来源、输出值的去向,其中那些大写单词都是系统提供的,我们需要用他们去填充我们的参数,然后传到顶点着色器和片元着色器中,进行进一步的计算,最后再通过语义作用到渲染目标上。 struct VertexIn { float3 pos : PO 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(19) 评论(0) 推荐(0)
摘要: DirectX12初始化 这几天跟着龙书把dx12的初始化过了一遍,写点东西记一下,免得之后又忘了。 创建d3d设备 d3d设备相当于对显示适配器的抽象,显示适配器一般为显卡,也可由软件来模拟。可通过下列接口来创建一个d3d设备: RESULT WINAPI D3D12CreateDevice ( 阅读全文
posted @ 2025-10-13 23:50 单身喵 阅读(24) 评论(0) 推荐(0)
摘要: C++关键字 static 类和结构体外的static 被static修饰后只在内部发生链接,其作用域只在其所在的文件中。 类和结构体内的static struct Entity { static int x, y; 静态成员变量 static void Print() { std::cout << 阅读全文
posted @ 2025-10-13 23:49 单身喵 阅读(7) 评论(0) 推荐(0)
摘要: 类 一种用户定义的引用[数据类型 类的基本概念 定义一个类: class Player { public: //访问权限 int x, y; int speed; //变量 void Move(int ax, int ay) //方法 { x += ax * speed; y += ay * spe 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(9) 评论(0) 推荐(0)
摘要: 重载运算 算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型. 算数运算符 注意事项: 对于内置的数据类型的表达式的的运算符是不可能改变的 不要滥用运算符重载 成员函数重载: class Entity { public: int m_X, m_Y; Entity ope 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(5) 评论(0) 推荐(0)
摘要: 指针 智能指针 作用域指针(unique_ptr) 超出作用域时会调用delete,销毁指针。 作用域指针不能复制,因为当其中一方销毁时,指针所指向内存会被释放。 std::unique_ptr<Entity> e1 = std::make_unique< Entity>(); std::uniqu 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(3) 评论(0) 推荐(0)
摘要: 引用 引用的语法 语法: 数据类型 &别名 = 原名 引用的本质是指针常量。 (int& b = a) == (int * const ref = &a) //自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改 int& ref = a; ref 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(5) 评论(0) 推荐(0)
摘要: 文件操作 文件类型分为两种: 文本文件 - 文件以文本的ASCII码形式存储在计算机中 二进制文件 - 文件以文本的二进制形式存储在计算机中 操作文件的三大类: ofstream:写操作 ifstream: 读操作 fstream : 读写操作 文件打开方式: 打开方式 解释 ios::in 为读文 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(3) 评论(0) 推荐(0)
摘要: 数组 vector容器 vector的基本概念 vector数据结构和数组非常相似,也称为单端数组 不同之处在于数组是静态空间,而vector可以动态扩展 vector容器的迭代器是支持随机访问的迭代器 创建一个动态数组(动态数组在堆上创建内存): std::vector<type> v; //创建 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(2) 评论(0) 推荐(0)
摘要: 内存分区模型 程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的。 全局区:存放全局变量和静态变量以及常量。 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等。 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。 程序运行前 ​ 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(2) 评论(0) 推荐(0)
摘要: 模板 C++另一种编程思想称为泛型编程,主要利用的技术就是模板 C++提供两种模板机制:函数模板和类模板 函数模板 函数模板的基本概念 函数模板作用: 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。 语法: template<typename T> //函数声明 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(2) 评论(0) 推荐(0)
摘要: 派生与继承 继承的方式 派生类(子类)是从基类(父类)继承而来的类,派生类将继承基类的属性; class Entity { public: float X, Y; void Move(float ax, float ay) { X += ax; Y += ay; } }; 公有继承:基类中的公有成员 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(3) 评论(0) 推荐(0)
摘要: 类型转换(cast) dynamic_cast dynamic_cast是专门用于沿继承层次结构进行的强制类型转换,其做了额外的验证工作去保证转换是有效的。该转换不是在编译时进行的,而是在运行时进行。当从父类转换成子类时,若转换失败dynamic_cast会返回空指针NULL。dynamic_cas 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(4) 评论(0) 推荐(0)
摘要: 可变参数模板(C++11) 上周末实现双向链表时参照了STL中的list链表,在查阅文档时发现list下的emplace方法的模板参数是template< class... Args > 当时就很疑惑,不知道这是什么参数,在网上学习了他人的博客后在此写下自己的见解。 可变参数的概念 可变参数即可以接 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(6) 评论(0) 推荐(0)
摘要: 函数 函数默认参数 函数的形参列表中的形参是可以有默认值的。 语法: 返回值类型 函数名 (参数= 默认值){} int function(int a, int b = 10, int c = 10) { return a + b + c; } 注意事项: 若传入数据,则使用传入的数据,否则使用默认 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(2) 评论(0) 推荐(0)
摘要: 程序的编译 编译器 预编译(预处理) 删除注释 处理预编译指令,如#define,#include,#pragma等。 编译 将预处理后的文本文件翻译成汇编语言。 汇编 将汇编语言翻译成二进制的机器语言指令,生成目标文件。 链接器 将生成的目标文件连接到一起。 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(4) 评论(0) 推荐(0)
摘要: STL STL基本概念: STL(Standard Template Library,标准模板库)。 STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)。 容器和算法之间通过迭代器进行无缝连接。 STL 几乎所有的代码都采用了模板类或者模板函数 阅读全文
posted @ 2025-10-13 23:48 单身喵 阅读(4) 评论(0) 推荐(0)