自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 git原理理解以及常用命令

git作为代码管理的工具,从原理,常用命令和提交流程作出了介绍

2022-10-05 22:03:03 237

原创 Unity——Shader

Shader在写Unity的Shader之前,我一直都在补充Opengl的知识,但是一查找Shader的案例没有说用OpenGL的?Unity的Shader的结构是这样的,首先是ShaderLab的框架,其中固定管线编程只能用它写,然后这个框架会镶嵌HLSL, GLSL, CG等高级语言的代码。那么CG和HLSL等是同时支持Opengl和DirectX的上层语言。而OpenGL是对于硬件等复杂操作的API封装。总结起来是这样一个关系。...

2021-04-11 10:52:20 178

原创 Unity——物理引擎

刚体(Rigidbody)Mass:质量,用于计算速度,加速度Drag:摩擦力,模拟运动中受到的阻力Angular Drag:旋转摩擦力,如果旋转的话,力越大,停下来的越快Use Gravity:是否考虑重力Is Kinematic:运动学刚体,暂时受transform控制,而不受物理引擎控制Collision Detection:碰撞检测频率,刚体和刚体碰撞需要检测,如果运动快的刚体,没有来得及检测就会造成穿透效果。Constrains:固定某一个轴不变刚体常常结合各种Collider碰撞

2021-04-04 23:11:16 614

原创 计算机图形学——阴影

阴影投影阴影我们我们根据点光源和多边形进行相似变换,通过变换矩阵实现,前提是我们只能投影到一个平面上。比如草原上的人的影子,马的影子,只要是影子都投影到草原上可以用到。阴影体首先要计算出处于阴影的阴影空间。然后判断我们看到的点是否在其中,若在,则减少其光照亮度。若穿过阴影体,深度缓存加一,穿出减一,最后通过模板测试判断是否为阴影。阴影贴图最常用的是阴影贴图。我们首先以光源位置进行一次深度记录,记录的内容是光源离最近表面的距离。并将改深度缓存存储到纹理空间。当我们第二次实际渲染的时候,投影之后将点

2021-04-03 21:32:19 926

原创 UGUI——基本组件

Text动态字体:用于实时生成,比如聊天打字等。静态字体:使用Unity3D的静态字体需要先制作静态字体库,可以借助BMFont这个工具来生成字体图集和UV信息,得到png图片和fnt文件。SDF字体:矢量字体,当界面放大或者缩小的时候,不会出现模糊。普通字体是记录UV坐标,生成纹理,SDF是记录距离轮廓的距离,并且在缩放的时候进行插值。...

2021-03-30 10:49:37 2093

原创 GLTF格式——关系描述

GLTFGLTF代表Graphics Language Transmission Format(图形语言传输格式)。这种跨平台格式已成为Web上的3D对象标准。简单来说,gltf通过json格式的文件来描述模型如何渲染导出。上图是我自己画的思维导图,描述了json格式里每个变量之间的关系。"buffers": [ { "uri": "moltenDagger_data.bin", "byteLength": 56076 } ]我们先从整体来看,gltf

2021-03-03 17:09:56 532 1

原创 排序算法整理

假设所有的排序都是从小到大排序插入排序:默认数组的前面m个数已经排好序了,将m+1个数插入进去,前面m+1个数是有序的,一直遍历到最后一个数。时间复杂度:当数组从小到大,O(N),从大到小O(n^2)空间复杂度:在原数组做交换,O(1)稳定程度:插入是保证相等数值的前后相对位置的,稳定。void InsertSort(int* arr, int arrayLength){ cout << "Insert Sort:" << endl; for (int i = 1;

2021-03-01 19:21:40 124

原创 leetcode-深度优先搜索

深度优先我们想要遍历一棵树也好,图也好,当我们想要遍历整个结构,查看所有组合的时候,深度优先搜索是一种选择。做法可以参考下面例题,深度优先要结合递归使用,当我们想搜索出全部的路径,就要把结果的可能在递归结束的时候解决。比如我们找到了叶节点,在判断结束递归之前,用一个比如vector容器储存该结果。用什么储存呢,从我们刚开始搜索的时候,也就是递归的入口,准备一个string,我们一直维护这个string,像下递归的时候也要传递下去。当我们某一个节点被递归到的时候,string添加字符,并开始下一层递归。

2021-02-21 13:55:27 147

原创 opengl学习笔记(七)

天空盒子天空盒子实质上就是一种纹理技术。我们通过之前的一些渲染过程,可以让空间中的一些模型投影到屏幕上。但是我们可能无法让视线中充满模型。比如在草原中,可能有一些羊,蒙古包,湖等等场景,但是我们没有办法模拟一望无际的天空模型,草原模型。所以解决方法是直接通过纹理贴图技术,定义好确定的纹理,因为我们不会在意天空的变化,同时我们保证了屏幕上的每一个像素总有颜色,总有场景可以看到。该纹理是三维纹理,可以是正方体或者球体等等。纹理随着摄像机移动,称为封闭纹理,可以想象一下纹理盒子将空间围了起来。为什么是三维

2021-02-21 10:05:37 138

原创 opengl学习笔记(六)

点光源上一篇博客我们提到的光照模型是基于平行光的,比如太阳。当我们使用点光源的时候,比如说灯泡,手电筒,光线会有一个衰减的效果。光的强度和离点光源的位置的平方成反比,并且为了使模型更加逼真,加入了常量因子,线性因子,指数因子,使其更加符合真实的效果。与平行光模型不同的是,平行光的入射方向由点光源和表面位置决定,就像计算人的视线和表面一样。并且考虑衰减和多个点光源的效果。struct { float Constant; float Linear;

2021-02-18 12:08:18 104

原创 opengl学习笔记(五)

贴图比如我们有一个匕首的模型,但是效果不是很炫酷。我们希望匕首上有很多好看的花纹。我们称这种花纹为纹理(我自己的理解),并保存在一些png等文件中,那么贴图的工作就是告诉片段处理器如何让几何图形对象相对的纹理像素。就好比我们的纹理像缓冲区的数据一样存在那里,可以反复用,你只需要定义好如何取就可以。纹理中的每个像素叫纹素,和顶点对应的是纹理坐标。纹理坐标不是像素的个数,而是将像素缩放到单位范围内,比如[0,1]。纹理坐标其实是一个比例,不如(0.5,0.5)的纹理坐标对应长700,宽1000的纹理就是第

2021-02-17 12:23:00 160

原创 opengl学习笔记(四)

相机空间上一节提到了投影变换 ,投影变换简单点说就是在我们的视角看物体,所以我们总想让摄像机的视线沿z轴方向。很多人了解过,从一个坐标系变换到另一个坐标系,其实通过复合变换一步就能实现。可是我们需要单独求出相机空间的变换矩阵,再乘以投影矩阵。为什么不能一步从世界坐标系到投影变换呢?我们在实际操作中,比如unity,我们可以任意改变摄像机的角度,方向。所以,摄像机坐标系它并不是固定的,是随时变化的。所以要多一步求出摄像机的变换。过程:我们首先知道摄像机坐标系在世界坐标系的原点坐标以及坐标轴矢量。学习矩

2021-02-15 13:31:25 127

原创 C++ 各类树的算法

树的内容比较多,我一步步积累到这篇文章中数据结构最基本的二叉树,结构体中分别有基本的左孩子节点,有孩子节点,val数据值等基本内容二叉搜索树:左孩子要比父节点小,右孩子要比父节点大。由于树构建完成后是有序的,所以插入,删除,查找都会有很大的优势。举一个二叉搜索树的例子:当我们实现排名的数据结构的时候,我们发现,对于任意一个根节点,左子树的排名都比自己小,右子树的排名都比自己大。也就是说,比如1~10000人的排名,数据为10000个人的分数。如果想要查找我们的位置,显然很容易。除此之外,我们可以利用

2021-02-14 15:08:07 712 1

原创 opengl学习笔记(三)

一致变量一致变量就是在shader中运行时不变的量,像是全局常量。往往是一些变化矩阵,比如顶点处理器中存在着坐标变换,并且对于每一个顶点的处理都相同,那么就用uniform定义。gScaleLocation = glGetUniformLocation(ShaderProgram, "gScale");通过这个函数,我们可以获得我们程序中的一致变量。第一个参数是我们连接到管线的程序,第二个参数是某一个一致变量的句柄。我的理解是在opengl中已经定义好了gScale,所以当我们索引gScale的时候

2021-02-14 12:17:47 317

原创 opengl学习笔记(二)

着色器opengl是区别于过去的固定管线渲染,是可编程管线。那么我们需要自己去实现代码,告诉CPU和GPU如何渲染。也有一部分内容,我们没有写的时候,opengl也有保留默认的设置。可编程管线流程:顶点处理器:每个顶点都需要经过一次,它从缓存区读出点的数据,进行矩阵变换位置,计算光照公式生成逐顶点颜⾊,⽣成/变换纹理坐标,同时将一些顶点的信息传递给下一个着色器。几何处理器:通过顶点着色器生成的点的位置之外,它也可以获取到点的属性之外的一些信息,点之间的相邻关系。于是,生成几何图元,例如三角形或者

2021-02-13 13:40:32 232

原创 opengl学习笔记 (一)

opengl是调用大量的图形API,这些函数封装好了对于硬件的操作。绘制窗口学习opengl,GLUT是负责其中的窗口交互等事件。glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);glutInitWindowSize(1024, 768); glutInitWindowPosition(100, 100); 像上述代码这样去定义我们想要什么样的窗口,并通过以下调用。创建出的窗口是基于我们之前定义

2021-02-12 22:15:16 180

原创 C# 集合 泛型 匿名方法(四)

集合集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。泛型泛型非常像我们学习C++时候使用的模板,我们在定义的类或方法后,加入一个, 那么我们方法中使用的类型可以用T,T只有在实例化时才能确定实际使用的类型,和C++的模板一个道理,不过只需要在类或者方法后加个就可以。匿名方法匿名方法是和委托一起使用的,当委托被实例化的时候,可以在它的下面附加一些代码块

2021-02-10 11:44:49 670

原创 C# 委托和事件 (三)

委托在C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。using System;using System.IO;namespace DelegateAppl{ class PrintString { static FileStream fs; static StreamWriter sw; // 委托声明 public del

2021-02-10 10:33:04 105

原创 C++ 链表 leetcode习题总结

链表的实现struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, Tre

2021-02-09 18:28:01 222

原创 C# 属性、索引器(二)

属性using System;namespace runoob{ public abstract class Person { public abstract string Name { get; set; } public abstract int Age { get; set; } } class Student : Person

2021-02-08 14:38:25 172

转载 C++ 知识点整理

函数的调用约定(https://blog.youkuaiyun.com/cc_946079647/article/details/38780815)

2021-02-08 13:31:52 137

原创 C++ 堆区和栈区的区别

堆区储存程序运行时分配的变量。运行速度快,例如我们使用数组,但是一旦越界,会导致程序错误,不可控。分配物理地址连续大小一般在10M以内栈内存满足先进后出栈区用于储存程序员申请 的内存空间。由程序员自己控制申请和释放,比较灵活物理地址不连续,当我们申请空间时,操作系统从空闲栈区寻找大于申请空间的空间进行分配。容易产生内存碎片。32位系统大小在4G左右。堆内存是一个像是有序的优先队列结构,第一个元素有最高优先权。可读写区用于储存静态变量和全局变量...

2021-02-08 13:10:58 523 2

原创 C++知识点 多态、静态多态、动态多态

多态有了继承才有多态的概念,首先说一下继承。继承的概念是派生类可以调用基类的成员。常举的例子,动物是基类,它拥有所有动物共有的一些特征和方法。它会衍生出猫的类,狗的类,派生出的类除了有动物公共的特性,还有属于他们自己的,例如叫声,科目等等。继承的好处就是我们不需要重复地去编写每个类的公共属性。只需要在对应的类添加属于它独特的特性就可以。继承的类型有三种:公有继承,保护继承和私有继承。公有继承:基类的保护是派生的保护,基类的公有是派生类的公有。就好比这是公共财产,是公家的,你接手了上一任的工作后,接

2021-02-08 12:05:54 240

原创 C#学习体会(一)特性和反射

我是按照菜鸟驿站的顺序学习的,这里记录一些我作为一个刚接触C#的小白的理解。更多的详细的解释以及代码示例可以参考以下链接

2021-02-07 14:17:53 295

原创 计算机图形学知识点整理(一)

计算机图形学知识点整理八叉树空间划分:八叉树是一个存储结构,我们的游戏空间存储的是三维的实体,那么这个实体是如何表示的呢?八叉树用一个正方体包含了这个对象,并且将正方体切分成八个小的正方体。八叉树的根节点是最大的正方体,八个小正方体分别是根的孩子节点,如果孩子节点所在的空间中都被实体填满,则认为它是叶节点,否则继续划分,递归直到划分为单位空间。知识点会持续总结,不断更新整理...

2021-02-06 13:01:20 908

转载 计算机网络面试题整理

计算机网络内容整理最近在找大厂的实习,一些和计网有关的计算机基础知识的链接会整理在这里TCP和UDP的区别及使用场景(https://blog.youkuaiyun.com/weixin_43477082/article/details/105070413)TCP的三握四挥

2021-02-06 12:51:38 61

原创 hash表 C++的使用以及理解

hash表 C++的使用以及理解最近在复习和刷leetcode的时候又复习了一遍哈希表,以及在C++中是如何使用的,并且会把做过的题整理到这篇文章中一、定义哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。为什么使用哈希表,它带给我们的好处就是可以为寻址带来遍历。由于哈希表的键和值是对应的,查找起来会比较迅速。但是

2021-02-06 11:38:28 15657 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除