- 博客(96)
- 收藏
- 关注
原创 C# 关于Type的一些操作(获取派生类, 获取程序域内类型, 获取特性等)
【代码】C# 关于Type的一些操作(获取派生类, 获取程序域内类型, 获取特性等)
2024-02-04 14:38:28
569
原创 unity 如何将字典显示在Inspector面板上
主要通过ISerializationCallbackReceiver接口来实现, 将所有的Value值存入List显示即可. 这里在value里存了一个Key 也可以将Key和value分别保存。
2024-02-04 10:18:20
1636
原创 ShadowMapping如何在光栅化时渲染阴影
具体做法使用shadowMapping做两次光栅化,分别对相机和光源做光栅化,再根据摄像机光栅化的结果判断光源是否可以照射到该位置,从而得知该点是否需要被渲染。非阴影部分必须满足同时被相机和光源看到,可以先在摄像机发射线检测,接着判断该点是否是光源深度缓存中该像素最小的点,是则不为阴影,否则是阴影。换句话说,如果是软阴影则意味着光源一定有一定大小。硬阴影个人理解为点光源照射形成。软阴影我理解为非点光源照射形成。
2023-06-04 15:20:04
175
原创 几何的显式表示 - 曲线和曲面
点云:list of points(x, y, z)将点云变成多边形的面,从而在计算机中输出多边形网格:Polygon Mesh就是 拆成小三角贝塞尔曲线定义曲线只要满足起止点即可,P1,P2决定了它要往哪个方向弯de Casteljau 算法定义一个范围在0 到 1 之间的时间t,分别找到(b0, b1), (b1, b2)之间的时间t插值,再计算这两个点之间的时间t插值即可得到b0到b2的时间t插值多个点该如何计算?使用递归逐渐减少运算规模伯恩斯坦多项式实际上就是自
2023-04-16 17:19:57
507
原创 计算机图形学 几何概论
通常给定空间中的一个点,那么就可以通过隐式的做表类型来判断它是否在集合表面上。下图中表示 规则类几何都可以使用拼接组合的方式来将他们表示出来。显示表示:将其实际拆分成三角形(直观),或者找出所有的uv映射。Distance Function(距离函数)通过对两个距离函数之间的融合,可以得到以下结果。隐式表示:只给出坐标和表面的关系(公式)空间中任意一个点到该几何体的最小距离。CSG:通过布尔运算组合隐式几何。水平集(类似等高线)
2023-04-04 11:20:39
156
原创 Pipeline渲染管线和Texture Mapping纹理映射
屏幕上任意一个采样点,找到其在纹理上的UV是哪一点,并用插值的方法查出改点在纹理上的颜色,可以认为该纹理定义的是漫反射的系数(布林冯模型中的Kd)上图中α,β,γ为该点相对于三个顶点的重心位置;这个用uv坐标系来定位贴图位置,是美术的工作。shader中大都只管一个点的属性。k_d:定义任何一个点的基本属性。目的是:在三角形内部进行插值。如何将纹理应用在渲染中?A,B,C为顶点坐标。
2023-03-24 23:20:59
445
2
原创 着色 Shading
Blinn-Phong模型:提出,V和R足够接近,说明法线和半程向量(n和h)非常接近。可以用差值来找三角形内某个点的平滑色值。I / r : 距离导致的光照衰减。n * l : 不被吸收的光线强度。高光:V和R足够接近可以看到高光。着色:对不同物体,应用不同材质。Ld :反射的光照强度。半程向量会比较容易计算。
2023-03-20 22:41:45
307
原创 深度缓冲 Z-buffering
具体做法: 1. 屏幕上的任意一个像素,初始化默认距离为无限远 2. 遍历每个三角形 3. 依次计算 三角形中每个需要覆盖到的像素,
2023-03-10 21:54:44
181
原创 虚拟相机 Cinemachine Virtual Camera
本质上,虚拟相机应该是相机行为的配置文件,虚拟相机之间的切换实际上就是在进行相机行为之间的切换;虚拟相机并不会创建任何摄像机,他只会创建虚拟节点,实际上操作的是虚拟相机属性设置完毕后,应尽量避免在游戏中对齐进行修改, 如有需要可以多创建几个。
2023-03-06 15:27:16
2646
原创 Unity虚拟相机控制中心 CinemachineBrain
虚拟相机是unity推出的一套官方相机管理方案,可以为开发者节省大量开发时间, 在实际游戏开发过程中会经常用到是虚拟相机的主要控制组件,当你在场景中添加虚拟相机时,会自动添加一个该脚本在主摄像机上, 或者也可手动添加.
2023-03-06 11:35:22
1901
原创 抗锯齿和走样(笔记)
通过上一帧的图像计算当前哪些图像不需要处理, 可以减少计算量,应该是配合使用。使用一种后处理,即 先得出有锯齿的图,然后找到边界,将边界换成模糊的。可以通过深度学习的方法来还原低分辨率的图像,将缺失图像猜出来。傅里叶变换: 通过图像的时域得出图像的频域,Super resolution 超分辨率。每个像素添加采样点,测算覆盖率解决走样。逆傅里叶变换: 通过频域得出图像时域。典型技术:DLSS(可以用于补帧)FXAA 快速近似抗锯齿。先做低通滤波,再做采样。
2023-03-02 16:48:11
439
原创 光栅化Triangles(笔记)
三条逆时针(或顺时针)边向量分别叉乘边到点的向量,按照右手定则,如果朝向一致,则说明该点在三角形内。(P0 P1) x (P0 Q) => 朝屏幕外。(P1 P2) x (P1 Q) => 朝屏幕外。(P2 P0) x (P2 Q) => 朝屏幕内。
2023-02-25 16:20:40
462
2
原创 图形学基础
摄像机无限远,所以成像时近处物体和远处物体都以原本的大小呈现;即:扔掉Z轴,其他压扁。定义:旋转矩阵的逆等于旋转矩阵的转置(在数学上被称为正交矩阵)想要将一个变换后的矩阵还原,只需要乘以他的逆矩阵即可。相同的将图像进行逆变换也是通过逆矩阵的方法。简单来说就是近大远小,是正常的人类视角。3维则是4 x 4 矩阵。假设绕n轴旋转,则有。
2023-02-22 00:24:20
297
原创 C++ 简易位图
位图没啥好说的,实际上就是将一个数组中所有二进制位拆分出来,一个bit表示一个bool量主要使用的还是位运算来做,非常简单,一看就会。
2023-02-03 00:08:13
238
原创 C++Morris遍历
Morris算法是针对二叉树实现的一个遍历算法,它是一种空间复杂度为O(1)的遍历算法通常情况下使用迭代或递归的方式遍历二叉树的空间开销都是O(N)级别的,较为理想的情况下可以做到O(logn)级别,而Morris算法通过更改节点指针指向的方式做到了它们都做不到的事情,可谓非常厉害。
2023-01-29 22:32:18
465
原创 C++ AVL树
众所周知红黑树是由AVL树改进得来的,想要深入学习哈希表的底层存储那么AVL的学习就相当有必要了。本来想将AVL的插入删除都能实现,但是在写删除功能时碰到了难题和Bug,所以暂时先给出插入的实现过程,和删除功能的实现思路。
2023-01-26 18:34:22
607
原创 Unity 如何使用协程等待加载完成
今天在项目打包后遇到一个bug项目在电脑上跑没问题,但是在手机端时,由于手机较差的性能,导致异步加载的资源需要等待较长的时间.而我在一个地方本以为是同步加载的资源,但是在调用时发现本该被加载完成的资源加载失败,大佬查看过底层实现后给出结论:这个资源使用了异步的加载方式,这就导致了我后面的访问越界.我的解决办法是通过开启协程,等待资源加载完毕不太了解协程的同学可以点击这里:协程简介和常用方法。
2023-01-12 18:36:06
2315
原创 Unity 实现一个特定动画状态切换树
构建树的主要原理分为两大块:拆解字符串,通过所有字符串进行构建树,这里写出伪代码:\。上面的这个只是信息,构建树结构我们是需要有指向的节点的,那么下面给出节点信息。已经构建好所有节点后,我们只需要给出外部接口,使节点根据概率移动即可。这个树结构只存储了所有信息,想要播动画需要在外部再实现控制器。
2023-01-11 16:15:36
842
原创 C++ 实现Manacher算法
这里我们采取从中间向两边扩散的方式,动态查找可能存在的最大回文串。例如以下标位置的为中心的最长回文子串为以下标位置的为中心的最长回文子串为以下标位置的为中心的最长回文子串为但是这种求解过程有一定局限性,它无法判断长度为偶数的回文串所以如果我们需要同时判断偶数个的子串,就需要从两个值之间的位置出发判断这里的选择,是通过直接添加补间字符的方式来解决这个问题。例如:这样的话我们就可以判断偶数串的回文情况。至于为何前后各额外添加了一个,则是为了后面方便计算使用。重构字符串代码:2.暴力解法
2022-12-28 23:40:27
872
原创 C++ 实现字符串查找 KMP算法
刚接触KMP算法时,你大概会觉得这个算法非常诡异,一波诡异的操作处理后生成了一个`next`数组,又一波诡异的遍历操作后,就找到了目标位置(???WTF);代码倒是不长,每个单词都认识,但是放一块就不认识了,像极了四级英语阅读。。(???WTF);代码倒是不长,每个单词都认识,但是放一块就不认识了,像极了四级英语阅读。。
2022-12-25 00:32:59
1265
8
原创 C++ 实现并查集结构
其实并查集的每个小集合就是一张有向图,只不过是所有**子节点指向父节点**的图结构。他之所以能够高效的合并和查找,是因为它在查找过程中,一直在动态更改所有走过节点的父节点。
2022-12-23 00:47:42
472
原创 一致性哈希
这个算法是一种特殊的哈希算法,目的是解决分布式缓存的问题。普通哈希算法在分布式存储具有较大的局限性,简单的讲就是难以扩展。一致性哈希相对而言具有较好的容错性和可扩展性,更加适合现在的分布式存储。
2022-12-22 16:42:13
521
原创 C++ 栈逆序
题目如下:你需要不借助其他任何数据结构,通过递归实现栈的逆序(我很想吐槽这个题,怎么会有人这么干?但是鉴于它的做法比较骚,所以还是写上记录一下)。
2022-12-18 00:40:03
913
原创 c++ 实现Djkstra寻路算法
- 本文来自左程云左神分享的视频教程内容 - 中间有一些地方写的比较随便,后面懒得改了,就在基础上加的; - 这一篇基本都是用的指针,你问我为什么要写成指针?我也不知道,大概是那会脑子抽了; - 理解Djkstra的基本思想之后,如果需要做抽象的话,可以将`Node`节点的`value`改成泛型,也可以加一个变量在里面,记录距离长度,再重载一下运算符,就可以实现自定义排序;这里就先写成这样,需要的时候再改 - 阅读本文前你需要先了解图的相关概念,还有STL的基本知识
2022-12-17 02:23:45
1098
原创 Unity UI点击事件系统
- 在Unity 的UGUI开发过程中,我们经常需要对UI图片进行操作响应各种处理比如:点击,长点击,长按,拖拽等多种功能的实现,这时原本的Button组件就不够用了 - 我们需要自己实现一个简单的点击事件系统来响应用户的各种操作,下面可以分析一下思路。 - 首先你需要提前了解点击事件的各个接口功能,了解C#中的委托使用,然后再学习这个系统
2022-12-11 00:01:40
5426
原创 C++ 实现前缀树
- 前缀树是一种查找结构,常用于指定字符串或是数组、线性表等**连续信息**的存储和查找。 - 他的作用类似于哈希表,但是它相对于哈希表来说,限制更多,通用性较差,但是它的功能更加强大,可定制性也更强。
2022-12-10 19:00:36
1273
2
原创 Unity中的协程
1. 协程(Coroutines) 是一种比线程更加轻量级的存在,也被称为用户态线程 2. 一个进程可以拥有多个线程,一个线程可以拥有多个协程 3. 协程并不会增加线程,它在线程中运行,通过分时复用的方式运行多个协程,其切换代价比线程切换代价小很多 4. 协程并非独立与线程,所以协程会因为线程的阻塞而阻塞,往往主线程阻塞时,其协程都会因为阻塞而得不到调度 5. 因此在协程中不能调用导致线程阻塞的操作,最好与异步IO相结合,比如打印,读取,socket接口等。
2022-12-04 19:06:27
1551
原创 计算点在线上的投影坐标
该线段必须给出确切的起始点和终点, 而不是一个向量,因为一个向量并不能代表一个线段。下图中蓝色标记的是未知量,黑色为已知量。向量归一化后其长度为一,所以我们可以将。又因为需要的是点到线段上的垂点。首先由向量的点积公式可知。所以我们得到的实际上是。由此即可得到目标点相对。
2022-11-27 20:35:34
1774
原创 Unity UI锚点和位置关系
一、Anchors锚点Anchors的设置会直接改变RectTransform中它的位置信息;Anchors设置中的X 改变会影响(PosX和Width)或(left和right)锚点的位置改变会影响 sizeDelta中物体的长度,用的时候要注意注:anchorMax/ anchorMin可以取到当前锚点位置,具体需要时可以灵活应用
2022-11-27 17:50:55
1978
原创 C# 中的特性
- 由方括号,特性名和参数列表构成,特性标签会被放在需要被修饰的元素之前。 - 在一个元素上,可以使用一个或多个特性进行修饰。 - 特性可以拥有参数。 - 程序可以使用反射检查自己的元数据或者其他程序中的元数据。
2022-11-24 00:47:13
681
原创 C# 中的反射机制
- 可以使用反射动态创建类型的实例,讲类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。 - 反射可以理解为操作metadata的一个类库(将反射当作工具使用,用于读取或者操作元数据)
2022-11-22 23:04:17
1482
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人