- 博客(87)
- 收藏
- 关注

原创 栈的应用——后缀表示法(逆波兰表示法)——Reverse Polish Notation
中缀表示法:平时所用的标准的四则运算表达式例如9 + (3 - 1) x 3 + 10 ÷ 2 称为中缀表示法后缀表示法:一种不需要括号的后缀表示法 也被称为逆波兰表示法:9 3 1 * + 10 2 / +1.那么从中缀表示法到后缀表示法是怎么转换的呢?回答:从左到右便利表达式的每个数字和符号,遇到数字就输出让他称为后缀表达式的一部分,若是符号则判断它与栈顶符号的优先级,如果是右括号或者优先级不高于(也就是<或者=)栈顶符号(乘除优先加减)则栈顶元素依次出栈,称为后缀表达式一部分,然后将当前符
2020-06-05 23:42:26
931

原创 栈的应用——Fibonacci——斐波那契数列
如果兔子在出生两个月后,就有了繁殖能力,一堆兔子每个月能生出一对小兔子来。假设所有的兔子都不死,那么一年后可以繁殖多少个小兔子?兔子对数:1 ,1,2,3,5,8,13,21,34,55,89,144递归方式using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Fbi{ class Progra
2020-06-05 21:46:24
564

原创 C#基础_值类型和引用类型
C#将数据类型分为两种:值类型和引用类型。这两种类型存储在内存的不同的地方:值类型存储在堆栈(Stack)中,而引用类型则存储在托管堆(managed)上。区分类型是值类型还是引用类型非常重要,这会造成不同的结果。在了解上面的知识之前首先应该弄清楚两个问题。1.什么是栈?栈可以理解为一种内存结构,它是先进后出的,就像桶装薯片一样,放进去的时候是一个接一个压进去的,在这里我们成为压栈,而要去拿...
2020-05-06 00:16:15
888

原创 C#委托和事件详解
1. 委托?A:委托字面意思就是一种代理B:C#语言里面委托则是让某个方法来实现需求的功能C:从数据结构方面来讲委托则是和类一样,是一种自定义类型D:委托它是对方法一类的抽象,就是一系列具有相同签名和返回类型的方法的地址,也就是说它存储的是方法的地址而不是方法本身F:调用委托的时候,委托一系列的方法都会按照顺序被执行2. Demo?比如我们定义一个人类Person如下,具有两个方法 ...
2020-04-25 16:12:52
1419
2
原创 AssetBundle加载的三种方式
AssetBundle加载的三种方式(脚本挂载直接可以使用。复习使用。商业有待验证)using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine;using UnityEngine.Networking;public enum LoadType{ None = -1, WebRequest = 0, Memroy = 1, File = 2
2022-05-05 20:01:33
1036
原创 最短路径-迪杰斯特拉(Dijkstra)
算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U.
2021-12-29 12:37:11
851
1
原创 克鲁斯卡尔(Kruskal)
核心思想假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止理解:图中的每个顶点都是一个连通分量,每次去寻找权值最小的边,然后判断最小生成树加入这条边是否会形成环,意思就是如果在不同的连通分量中则可以加入,如果在想通的连通分量中则不可以合并因为会构成环,怎
2021-12-27 13:45:36
325
原创 最小生成树-普利姆算法(Prim)
基本思想对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,直到U=V为止,最小生成树构造完毕,这时集合T中包含了最小生成树中的所有边。public class Edge { public int start; public
2021-12-26 10:02:39
589
原创 小红点模块
树状结构 每一个红点脚本 拥有多少父节点 和当前孩子显示的数量底层数据发生变化上层跟着变换。支持主动查询和被动通知。using System.Collections;using System.Collections.Generic;using UnityEngine;public delegate void OnRedPointChange(bool disPlay);public class TrackPoint{ /// <summary> /// 当前红点是否
2021-11-27 14:26:01
303
原创 前-中-后 序遍历
using System.Collections;using System.Collections.Generic;using UnityEngine;public class TraversBTree : MonoBehaviour{ //前序遍历 public void TraversalByPreorder(BTree tree) { Stack<BTreeNode> stack = new Stack<BTreeNode>()
2021-11-22 10:21:57
348
原创 事件管理器
事件管理器(后续会不断完善)using System.Collections;using System.Collections.Generic;using UnityEngine;public delegate void EventCallBack(params object[] args);public class Single<T> : MonoBehaviour where T : Single<T>{ protected static T _instanc
2021-11-19 08:44:58
437
原创 任务定时器
任务定时器模块(后续会随着经验增加不断完善)using System.Collections;using System.Collections.Generic;using UnityEngine;public delegate void TaskTimerCallBack(object param);public class TaskTimer { private Dictionary<TaskTimerCallBack, TaskTimerParameter> _dicTo
2021-11-19 07:01:04
293
原创 对象池系列
对象池系列(一)对象池的核心思想:预先初始化一组可重用的实体,而不是按需销毁然后重建。每次要用的时候都去创建用完就销毁掉,会造成频繁的资源回收;首先应该有基本的两个方法生产Spawn回收Despawn.假如我们需要对子弹Bullet进行Spawn和Despawn处理。于是我们定义了一个IPool接口和Pool类using System.Collections;using System.Collections.Generic;using UnityEngine;public interface I
2021-11-17 13:56:51
274
1
原创 单链表——泛型
Node节点类public class Node<T>{ private T data; public T Data { get => data; set => data = value; } private Node<T> next; public Node<T> Next { get => next; set => nex
2021-10-27 19:18:27
165
原创 单链表-普通
最基本的单链表ILink接口public interface ILink{ /// <summary> /// 增加 /// </summary> void Append(Node node); /// <summary> /// 删除 /// </summary> Node Delete(int index); /// <summary> /// 插入
2021-10-27 15:45:35
139
原创 C#中Ref和Out
问题:现在需要通过一个方法交换a,b两个变量的值,应该如何做?我是如下做法: int a = 1; int b = 2; public void ChangeNumber(int a, int b) { int t = a; a = b; b = t; Debug.LogFormat("方法内a=>{0}", a); Debug.LogFormat("方法内b=>{0}", b);
2021-10-07 20:27:52
252
原创 噪声纹理-Dissolve进行消融效果Shader
Shader "QShader/Dissolve"{ Properties{ _MainTex("Main Texture",2D) = "white"{} _NoiseTex("Noise Texture",2D) = "white"{} _Threshold("Disappear Threshold",Range(0,1)) = 0 _BurnFirstColor("Burn First Color",Color) = (1.0,1.0,1.0,1.0) _BurnSecondC.
2021-10-02 19:33:12
279
原创 ToonShader-卡通渲染
Shader "QShader/ToonShadingOne"{ Properties{ _MainColor("Main Color",Color) = (1.0,1.0,1.0,1.0) //渐变纹理 _Ramp("Ramp Texture",2D) = "white"{} //控制轮廓线大小 _OutLine("Outline",Range(0,1)) = 0.1 _
2021-10-01 19:44:33
441
原创 Billboard_ByAll-全方位的BillBoard
由于需要面向视角方向。因此需要重新构建向上向量。1.先构建出View视角向量 然后和Up(0,1,0)向量叉积得到向右向量。这个时候向右向量和View向量是两两垂直的。3.再由View向量和向右向量叉积,得到重新计算后的向上向量Up1。4.这个时候由Up1 View Right三个正交基向量构建出旋转矩阵。Shader "QShader/Billboard_ByAll"{ Properties{ _MainTex("Main Texture",2D) = "white"{} } SubS
2021-09-28 19:56:44
137
原创 BillBoard-广告牌技术只旋转Y轴
通过计算旋转后的三个正交基 来构建旋转矩阵。1.首先要计算视角向量。模型的中点Center可以设置为(0,0,0)。ViewDir = 摄像机的位置 - Center可以得到视角向量。2.向上向量Up (0,1,0)这个最简单。3.构建向右向量可以通过叉积计算出垂直与Up和View的向右向量Right。4.再通过Up和Right向量叉积计算出新的视野View’向量。5.最后通过Up Right View’三个正交基构建出旋转矩阵。Shader "QShader/Billboard_ByY"{ Pr
2021-09-27 18:01:08
465
1
原创 顶点动画-VetexAnimation
Shader "QShader/VertexAnimation"{ Properties{ _MainTex("Main Texture",2D) = "white"{} _XSpeed("X Axis Speed",Float) = 1.0 _YSpeed("Y Axis Speed",Float) = 1.0 } SubShader{ pass { Tags{"Ligh
2021-09-27 16:14:48
188
原创 对纹理进行uv坐标偏移
Shader "UShaderMagicBook/UvOffsetAnimation"{ Properties{ _MainTex("Main Texture",2D) = "white"{} _XSpeed("X Axis Speed",Float) = 1.0 _YSpeed("Y Axis Speed",Float) = 1.0 } SubShader{ pass {
2021-09-27 15:45:21
482
原创 Shader实现帧动画-FrameAnimation
Shader "QShader/FrameAmination_One"{ Properties{ _MainTex("Animation Texture",2D) = "white"{} _BaseColor("BaseColor",Color) = (1.0,1.0,1.0,1.0) _XCount("XCount",Int) = 1 _YCount("YCount",Int) = 1 _Speed("Speed",R
2021-09-27 14:58:10
197
原创 菲涅尔反射
菲涅尔反射 :视线垂直于表面时,反射较弱,而当视线非垂直表面时,夹角越小,反射越明显.例如:如果你站在湖边,低头看脚下的水,你会发现水是透明的,反射不是特别强烈;如果你看远处的湖面,你会发现水并不是透明的,但反射非常强烈Schlick菲涅尔近似等式! F0是一个反射系数,用于控制菲涅尔反射的强度,v是视角方向,n是表面法线Shader "QShader/FresnelReflection_schlick"{ Properties{ _BaseColor("Base Color
2021-09-26 16:13:38
2719
原创 Refract-折射
斯涅尔定律-Snell’s Law :n1 * Sin a = n2 * Sin b,n1 和 n2就是两个物体的折射比,a = 入射角 b = 反射角 移动 :n1 / n2 = sin b / sin a = 透射比。Shader "QShader/Refract"{ Properties{ _BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0) _RefractColor("Refract Color",Color
2021-09-26 14:55:10
356
原创 ReflectCubeMap
Shader来实现反射效果:通过相机的视角方向和物体模型的法线方向来计算反射方向。然后通过反射方向在CubeMap当中进行采样。采样得到的结果和主纹理进行线性插值。Shader "QShader/ReflectCubeMap"{ Properties{ _MainTex("Main Texture",2D) = "white"{} _BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0) _ReflectC
2021-09-26 14:04:37
128
原创 ShadowMap-Example
Shader "QStudyShader/ShadowMap"{ Properties{ _MainTex("Main Texture",2D) = "white"{} _BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0) _Gloss("Gloss",Range(8.0,200)) = 20.0 } SubShader{ pass {
2021-09-25 17:35:29
73
原创 ScreenSpace-ShadowMap(屏幕空间的阴影映射技术)
Question1:阴影是如何产生的?当一个光源发射的一条光线遇到一个不透明物体时,这条光线就不可以再继续照亮其他物体了(这里不考虑光线反射的情况),因此这个物体就会向它旁边的物体投射阴影,那些阴影区域的产生是因为光线无法到达这些区域。ShadowMap?在Unity中,这个技术的实现是通过将摄像机位置与光源位置重合(光源空间),然后按照正常的渲染流程渲染出深度图来作为阴影映射纹理。但是需要注意的是,与正常渲染不同的是,由于我们只需要深度图信息,而正常的渲染流程会多出不必要的光照模型计算(Base P
2021-09-25 16:11:19
2232
原创 光照衰减-Lights
Shader "QStudyShader/Lights"{ Properties { _MainTex("Main Texture", 2D) = "white" {} _BaseColor("Base Color", Color) = (1.0,1.0,1.0,1.0) _Gloss("Gloss", Range(8.0,200.0)) = 20.0 _Scale("Scale",Range(0,1)) = 1.0
2021-09-24 09:39:06
322
原创 透明度混合-Blend
Blend-透明度混合什么是混合:当片元着色器产生一个颜色的时候,可以选择和颜色缓存中的颜色进行混合。这样看来,混合就和两个操作数有关系。1.源颜色-Source Color :指的就是由片元着色器产生的颜色2.目标颜色-Destination Color :指的就是从颜色缓存中读取到的颜色对源颜色和目标颜色进行混合后会得到输出颜色,它将重新写入到颜色缓存当中。需要注意的是当我们谈到混合中的源颜色和目标颜色时,它们都包含了四个通道RGBA- Red Green Bule Alpha,而不仅仅是RGB
2021-09-22 12:55:06
328
原创 透明度测试-AlphaTest
透明度测试依据透明度把指定的像素块剔除掉。Shader "QStudyShader/AlphaTest"{ Properties { _MainTex("Main Texture",2D) = "white"{} _BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0) _Alpha("Alpha Threshold",Range(0,1)) = 0 } SubShade
2021-09-22 09:33:43
619
原创 遮罩纹理-MaskTexture
遮罩纹理//所谓的遮罩纹理和渐变纹理是类似的//渐变纹理就是希望光照部分不要对所有的部分都一模一样 而是变换的//遮罩纹理就是希望高光部分不要都一模一样 而是高光部分各有不同Shader "QStudyShader/MaskTexture"{ Properties { _MainTex("Main Texture",2D) = "white"{} _BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)
2021-09-21 17:53:43
541
原创 渐变纹理(光照渐变)
渐变纹理(光照渐变)在计算公式兰伯特光照模型 diffuse = I * albedo * saturate(normal * lightDir)当中 I=光照强度是固定的 albedo=主纹理也是固定的。只有后面计算是不固定的 所以先计算后面部分saturate(normal * lightDir) 对渐变纹理进行采样 然后和主纹理 表面颜色进行正片叠底混合Shader "QStudyShader/RampTexture"{ Properties { _MainTex("Texture",
2021-09-21 15:43:53
487
原创 凹凸映射Bump_Mapping
凹凸映射所谓凹凸映射(Bump Mapping)就是通过一张纹理贴图来轻微的修改模型表面的法线,让它可以为模型提供更多的细节Shader "QStudyShader/Bump Mapping"{ Properties { _MainTex("Texture", 2D) = "white" {} _BaseColor("BaseColor",Color) = (1.0,1.0,1.0,1.0) _BumpTex("Bump Texture",2D) = "bump"{} _BumpS
2021-09-20 18:40:32
429
原创 纹理映射-TextureMapping
纹理映射Shader "Unlit/TextureMapping"{ Properties { _MainTex ("MainTexture", 2D) = "white" {} _BaseColor("BaseColor",Color) = (1.0,1.0,1.0,1.0) } SubShader{ Pass{ Tags{ "LightModel" = "ForwardBase"
2021-09-20 16:31:27
392
原创 PhongAndBelinnPhong光照模型
Phong光照模型Shader "QStudyShader/Phong"{ Properties { _BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0) _Gloss("Gloss",Range(8,100)) = 20.0 } SubShader { Pass{ //我们需要先根据入射光方向和法线方向计算出反射光方向,然后通过反射光方向的和视角方向夹角的余弦值来决定高光的强度。 Tags { "LightModel.
2021-09-19 18:18:27
84
原创 半兰伯特光照模型
Shader "QStudyShader/Per_Fragment_HalfLambertLaw"{ Properties{ } SubShader{ Pass{ Tags{ "LightModel" = "ForwardBase"} CGPROGRAM #include "Lighting.cginc" #pragma vertex Vertex #pragma fragment Fragment struct a2v { float4 vert.
2021-09-19 15:18:56
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人