自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 简单描述下A*寻路

纯文字总结,不会涉及具体代码。A*寻路,其实本质上就是Dijkstra寻路的一种加料版。所以,可以先看看什么是Dijkstra寻路。此寻路中,连通的节点间存在着通过的消耗值(泥泞的土地消耗就比平坦的道具大)而节点本身拥有一个代表从起点到此节点本身之间所有的消耗值。流程如下:每次观察当前节点周围可抵达的节点,计算并赋予每个邻居他的消耗总值(当前节点的总消耗加上通过的消耗),并...

2019-11-14 15:04:40 158

原创 什么是引申音tension 以及什么是可用的引申音available tension

我们知道和弦有其固有的色彩小七和弦 可以表达忧郁 哀伤属七和弦 可以表达矛盾 挣扎大七和弦  可以表达愉快 冷静基本和弦之所以可以表达这些情感是因为 所谓的guide tone (而所有和弦音1357被称作chord tone)也就是3音和7音    3音7音和根音的关系决定了这个和弦的色彩而仅作为chord tone 存在的1音和  5音  对和弦色彩的建立并没有什么卵用...

2019-02-17 17:11:09 1454

原创 什么叫做和弦的同功能替代

直接上结论众所周知的251中2能被 4  6替代5能被 7 替代1能被3 替代至此同一个调性内 7个音级 都有了自己的功能类别2 4 6姑且称为 下属功能组    5 7称为属功能组  1 3称为主功能组这3种功能从直观来讲 对应 起承转合  (就像讲故事一样,好的故事一定有起始 高潮 收尾的那种感觉,对应和弦的3种功能)于是 为什么能被替代?原因同样非常直观...

2019-02-14 18:44:57 2201 1

原创 法向半球内单位向量(切空间) 转世界空间表示

已知此切线空间的法线在世界空间中的表示N,求此切线空间构成的半球形空间任意单位向量(θ,φ)在世界空间中的表示首先根据N,计算该向量所在切线空间另外两个正交基的世界空间表示。先设一个临时向量Vtemp(0,1,0)        ( it works....)则切线单位向量Vt = cross(Vtemp,N)    副切线单位向量Vbt=cross(N,Vt);然后,看图.....

2019-01-25 21:53:49 922

原创 Pbr和一般光照模型的区别

pbr (physically based rendering) ,基于物理的渲染。首先明确一点,物体有颜色是因为那些没有被物体吸收的光线(表现为物体的颜色)射入你的眼睛,你才感知到了颜色。从光照模型的角度来说,射入你眼睛的有两种光,一种是直接的反射光(表现为光本来的颜色),一种是折射进入物体后又散射出来的所谓漫反射光(即被吸收过了的光,也就是贴图的颜色)pbr和原始的blinn-phon...

2019-01-24 08:56:33 6351

原创 用人话解释 格拉姆-施密特正交化 gram-schmidt process

不管谷歌还是百度,这个关键词搜出来的内容都太学术了,废了点功夫才搞懂这东西有什么用。下面用人话解释一下。结论:  任意给定两个向量V1 V2,就可以两个向量组成的平面为基准,构建三个正交基a b c首先,a向量通过单位化v1获得,然后计算v2在v1上的投影v3(dot)b向量通过单位化  v2-v3的差 来获得最后c  通过a 和 b叉乘得到。 ...

2019-01-23 18:36:26 5519 5

原创 直观理解SSAO原理

SSAO ,screen space ambient occlusion  屏幕空间环境光遮蔽。一般光照模型中,环境光用于模拟光线的二次散射,从而使得不受直接光照的地方也能有相应的亮度。很明显,犄角旮旯里,不应该有太多的光被散射出来,所以犄角旮旯和露出表面的环境光不应该相同。而在光照模型中,环境光是一个定值。所以ssao出现了,他解决的就是 如何定量犄角旮旯应该吸收(二次散射不出去...

2019-01-23 17:29:03 10753 1

原创 视差映射 Parallax Mapping

这种技术和法线贴图结合使用,可以给物体表面增加惊人的细节,这边只谈实现上的注意点。首先是最简单的一种,一般不会采用的那种,但用来理解最核心的思想是极好的。(视差映射在实现时,通常采用的是深度图而非高度图,储存的信息是当前像素凹下去的程度)如图所示,A点即是当前片元着色器正在处理的片元位置。如果不应用任何视差映射技术,则此时应该用A的uv值去相关贴图里采样。但,现在为了体现这个点的位...

2019-01-22 20:52:38 1464

原创 ShadowMap 中的 Shadow Asne

阴影技术中最简单的一种(其他的可以算作他的变种)是所谓的shadow mapping(适用于平行光)他需要事先为场景中的物体,在以光源为视角的视口内,渲染一张深度图。在那个视口里,只有最靠近光源的片元才能将自己的深度写入这张深度图。随后,就正式开始渲染场景了。在正式的片元着色器中,需要先求出片元在光源坐标系内的位置,用xy当作uv坐标值去采样深度图里的深度值,同时用z值和这个深度值比较...

2019-01-22 11:31:59 571

原创 Gamma矫正,先有鸡还是先有蛋的故事

先上图 此图出于LearnOpenGl CN。原文可能由于翻译的关系,导致内容其实并不好理解。翻阅了不少资料后(其实就是冯乐乐老师的入门精要,逃...),想对gamma矫正做一个简单的总结。先剖析一下这张图的含义(此图其实不是重点)。首先,横轴代表,给计算机提供的颜色的物理强度rgb(图片上储存的信息或是shader的输出),纵轴是计算机实际会为这个值提供多少物理强度中间直的小点虚...

2019-01-21 10:52:22 551

原创 浅谈Batch SetPass 以及 Shader Material Texture的关系

简单总结一下这些东西和opengl对应概念之间的关系。首先unity 将glDrawElements这样的调用 称作一次Batch(以前叫Drawcall),将对于GPU来说比较昂贵的操作称作 SetPass昂贵的操作是指哪些呢? 更换Shader  以及 更换Texture还有一个不太确定,就是传递Uniform变量,猜想所谓的MateiralInstance(比如脚本中获取...

2019-01-19 11:47:24 678

原创 什么是ECS + Job

单纯的ECS其实对性能提升并不大,那为什么Unity要推ECS,而且1年后铁定抛弃原来的Mono架构?(并不是完全抛弃,UI上任然会使用原来那一套)因为ECS天生的多线程友好。搭配上Unity的JobSystem,轻松占满100%的Cpu,让cpu全速工作(在多核年代,占满CPU意味着牛逼)。如果到时候你还不会ECS+Job,只能干瞪眼。好了,接下来要说明的是 ECS 是什么 以及为什么对...

2019-01-12 13:27:48 500 1

原创 协程VS多线程 应用场景比对

众所周知 ,多线程除了会给cpu带来切换上下文的开销,还会产生资源竞争,想要用多线程,免不了这里那里加个锁。所以多线程在有些时候并不讨巧。所以,协程出现了,他也可以并发的执行多线逻辑,但完全不会给cpu带来额外负担,且不存在任何资源竞争。看起来,协程可以完美替代多线程了。但其实,协程也只是在特定应用情境下才适用。使用多线程的目的之一是为了不阻塞主线程的迭代循环,让主线程可以顺畅...

2019-01-07 10:44:35 2384

原创 CLR via C# 笔记 ----Task(任务) 2

Task的取消CancellationTokenSource用来取消Task,可以为Task的构造函数传递一个此类的实例。当调用实例的cancel方法时,Task会被提意取消为何说是提意,因为取消是协作式的,也就是说你这边提意了,Task的工作函数里还必须显示的写一点响应逻辑才能真正的取消执行。在工作函数内部,通常在一个循环内,持续调用CancellationTokenSource实例...

2018-12-21 00:18:07 158

原创 CLR via C# 笔记 ----Task(任务) 1

直接给线程池添加工作项的方式很直接,但是无法得知工作项何时结束,并且不能获得返回值于是,CLR提供了一个Task类封装了工作项以下三种写法某种意义上来说是等价的 //1作为object传递(仅仅是举例的作用),当回调需求一个ojbect参数时,需要额外传递这个参数 ThreadPool.QueueUserWorkItem(DoSth,1); new ...

2018-12-20 15:51:11 171

原创 CLR via C# 笔记 ----线程基础

在Windows中,进程是对应用程序需要的资源(内存)的抽象,就好像程序正在独占着这些资源(虚拟内存)一样线程是对运行应用程序的cpu的抽象,就好像这个程序正在独占着这个cpu一样(然而此线程 会被其他线程抢占)在Windows中,进程是十分昂贵的,创建一个进程要花几秒钟的时间,必须分配大量内存且初始化,EXE和DLL文件必须从磁盘上加载,等等。相反,在Windows中创建线程则相对廉...

2018-12-20 12:47:01 187

原创 什么是四种七和弦 和三种转位

七和弦简单来说就是 4个音一起出现,他们会以其中的一个音为根音,其他3个音以某种规律排列在根音周围(一个喜欢刨根问底的同学问道:...为什么和弦只有4个音 不能是5个,6个,7个,8个?老师无奈的回答: 因为老师的一只手张不开那么大...)先上图我们以F这个键为起点,找他的四种七和弦第一种  Fmaj7      (大七和弦)    规律:从F开始数  第0个 第4个 ...

2018-12-13 16:20:31 6538

原创 UniRx---源码阅读提示 FromCoroutine

先上函数 public static IObservable<Unit> FromCoroutine(Func<IEnumerator> coroutine, bool publishEveryYield = false) { return FromCoroutine<Unit>((observer, cancellationToken) =&...

2018-12-12 22:18:11 532

原创 Unity--- 简单模仿一下原生协程的实现

先来看下测试代码 ... void Start() { CoroutineManager.Manager.StartCorouine(testWaitTime(1)); CoroutineManager.Manager.StartCorouine(testWaitTime(2)); //CoroutineManager.Manager....

2018-12-12 16:41:25 671

原创 UniRx---Subject ReactiveCommand

先说前者Subject<T>相当于是一个事件(通常在UniRx中理解成发射源), 调用OnNext(t)可以给自己的订阅者发射T类型的数据而接收者可以用UniRx的操作符对发射进行各种过滤、拼接、转换 。 这即是subject优于传统事件的地方。后者 ReactiveCommand<T> 本质上仍然是一个Subject<T>他通过调用Excute...

2018-12-12 10:21:49 739

原创 UniRx---ReactiveProperty ReadOnlyReactiveProperty

两者有个共同点 内部都有一个容器储存subscribe时传进来的observer前者很像subject,区别就在于 subject是通过直接调用方法来发射数据的而ReativeProperty是通过给Value属性赋值来发射数据(值和原来不同时,给所有保存的observer发射数据) 而ReadOnlyReactiveProperty是一朵奇葩,他其实同时是observable 和...

2018-12-12 01:50:43 947

原创 UniRx---简单封装一个SubjectManager 解耦主题和监听者

Subject<T> 是UniRx 推荐的 事件实现方式 ( UniRx是AssetStore上的一款免费插件,但其实他的出身很地道,脱胎于微软的Rx框架,主要思想是像Linq那样对订阅的事件进行操作,并且他还能对操作进行 时间调度,线程调度,而UniRx就是Rx的Unity版) 。在开发中,这种数据发射工作(在使用UniRx时,可以把事件触发时调用观察者回调并传递参数的行为 形象的理...

2018-12-11 16:45:55 787

原创 UniRx---源码阅读提示 IObservable IObserver

核心的两个接口 public interface IObservable<T> { IDisposable Subscribe(IObserver<T> observer); } public interface IObserver<T> { void OnCompleted(); ...

2018-12-11 14:27:34 636 1

原创 UniRx---源码阅读提示 OperatorObservableBase OperatorObserverBase

create型的Observable(用户自定义) 需要缓存一个fun<Iobserver<T>,IDisposible>  用来决定subscribe时的行为(包括返回一个注销器)而内置的Obserable 不需要缓存这个回调是因为 注册时候的逻辑是固定的 所以不需要observable创建者提供自定义的注册行为 有些observable继承的一个基类:Operat...

2018-12-11 13:46:10 261 1

原创 UniRx---Take

乍看之下,比较无趣的操作符拿取序列中的前多少个元素,真的是这样无趣吗?请看如下这个双击判断的实现​ public class Take : MonoBehaviour { void Start() { //用了一个selectMany的技巧把传来的无效参数重新转换成一个事件源 ...

2018-12-07 15:02:55 475

原创 UniRx---SelectMany

这是个神奇的操作符,本质功能和select一样 提供一种转换只是你必须把传来的对象转换成可迭代的对象。很直观的用法可以打散容器里的容器,比如一个list<string> 对他进行默认selectMany后 就会变成一堆char下面,展现一种非常imba的用法可以任意组合协程的执行顺序!! public class SelectMany : MonoBehaviou...

2018-12-07 14:27:47 828

原创 初学UniRx有感

很久没有那种写完代码后的舒爽感了,直到这几天遇到了UniRx我真的被这种简洁,这种优雅给惊呆了。我还只初学了一些皮毛,天知道深入学习以后还有什么惊喜等着我...简单来说 ,对于Unity脚本,UniRx可以解决Update的臃肿和堆砌的成员变量过多的问题。可以用极少的代码完成时间上的异步逻辑,可以使用响应式属性(可以订阅其变化的属性)和SetUIXXX之类的丑陋接口说拜拜。这边...

2018-12-06 22:54:17 777

原创 UniRx---Where

很好理解的 操作符,相当于是 过滤器事件源 携带 自己的参数 流经此处后,会被一个判断函数拦截通过后,仍旧携带本来的参数

2018-12-06 03:01:59 464

原创 UniRx---Select

UniRx中所有可订阅的对象都是一种事件源,并且可以传递给订阅者一些参数而Select,它就像一种转换器把事件源传递过来的参数 转换成另外一种形式  转换前后的类型也可以不同比如你有一个reactive的int属性Hp(响应式属性, 或者说可订阅的属性,是UniRx的魅力之一,语法简洁,提供订阅功能,观察属性的变化)本来这个事件源传递的是一个int型的参数而Hp.Selec...

2018-12-06 02:37:05 726

原创 UnityAction 、UnityEvent、 EventTrigger

UnityAction是 void的带一个参数的委托UnityEvent是对UnityAction的封装  Addlistener相当于+=   Remove相当于-=EventTrigger是一个实现了所有点击拖拽等等接口的组件添加了他就等于实现了所有接口。但是他的回调注册机制很奇怪,此类的内部有一个Entry的listEntry是一个struct,保存两个东西,一个是事件类...

2018-12-05 00:22:29 1581

原创 对设计模式的小见解

23种设计模式大名鼎鼎,如雷贯耳。但是当我们仔细剖析其中的内涵时,却发现基本上里面的大部分的设计模式都很雷同比如状态机和责任链他们本质上就是在高层模块用相同的代码动态切换不同的状态对象来运行不同的逻辑传统的状态机中,不同的类就代表了不同的状态而责任链其实和状态机很像,但是他不用类来区分状态之间的区别 (一个责任链子中的责任对象可以是同一个子类的对象)而是用基类的某个属性来区分责...

2018-12-04 18:36:02 174

原创 自动打AssetBundle包的基本思路

思路就是 先变着法的给每个资源都打上包名标记(自动之处),然后调用api ...没了..在调用api进行打包时,unity会自己查找依赖关系,不会重复打已经打过的资源(并且是增量打包)我们知道资源之间是有依赖关系的,比如模型依赖材质,材质依赖图片、shader等等(资源间的依赖,可以调用api查看)比如资源A上了包名标记P1  而他依赖的资源B上了包名标记P2这时候包P1就依赖了包...

2018-12-04 17:38:37 175 1

原创 钢琴为什么设计成两排,并且黑白相间 (认识钢琴)

先上一张图 这是五线谱和钢琴琴键的映射关系大家请看,这里有这么多的琴键,每个琴键(黑白)依次半音升高,这里仅仅6个八度,大概70多个键试想,如果琴键只有一排(同样大小的一排),同样88键的钢琴,得多长!!怎么弹!所以解决了第一个问题 为什么设计成两排 。然后第二个问题,为什么要黑白相间,并且黑键会三个 两个一组?我感觉设计钢琴的人真他娘的是个天才。(先说一下,乐理中八度...

2018-12-04 12:43:57 1898

原创 我为什么写博客

首先是当作一种记录,避免重复思考,把当时的心得体会记录下来,属于读书笔记型博客顺大便,做一些我觉得有用的分享

2018-12-04 12:03:03 95

原创 为什么c++的指针那么难学?

指针本身是一个很浅显的概念,它就是代表了内存中的一个地址通过这个地址 就能获取这个地址上保存的数据嗯,很简单的道理。但为何写起代码来就感觉被浆糊团团围住?因为语言发明者给刚入门的程序员搞了一个非常不友好的设定两个意思相近但其实很不一样的操作符 却用了同一个符号!在声明一个变量名字是什么类型的时候*这个符号 代表了你声明的这个变量名字 是一个指针当声明完成后,这个名字...

2018-12-04 11:55:55 1321

原创 谁在关联prefab的属性?

本质上.prefab预制体和.unity场景 就是一种序列化后的文件 (序列化就是把内存中的对象保存进文件或者流,可以是人看得懂的格式比如xml,也可以是人看不懂的二进制格式)一个被拖进场景的物体在inspector中看到的属性 皆是由Unity通过正反序列化更新(本身也是)如果对'蓝色物体'进行修改但是没有点过apply 那这些修改过的属性就由场景负责正反序列化 (transform不修...

2018-12-04 11:23:00 160

原创 UnityEditor.AssetDatabase.LoadAssetAtPath()的坑

这个api可以在编辑器play状态下加载资源(重要的事情说一遍就行了)填写的路径一定要以Assets开头  这是个坑。另外有时候会用FileStream打开文件,这时候的路径要用Application.dataPath这个开头相当于xxxxxxxx/Assets别搞混了...

2018-12-03 17:38:37 16589 6

空空如也

空空如也

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

TA关注的人

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