<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zwlstc的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zwlstc</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zwlstc]]></copyright><item><title><![CDATA[简单描述下A*寻路]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/103065582</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/103065582</guid><author>zwlstc</author><pubDate>Thu, 14 Nov 2019 15:04:40 +0800</pubDate><description><![CDATA[纯文字总结，不会涉及具体代码。

A*寻路，其实本质上就是Dijkstra寻路的一种加料版。

所以，可以先看看什么是Dijkstra寻路。

此寻路中，连通的节点间存在着通过的消耗值（泥泞的土地消耗就比平坦的道具大）

而节点本身拥有一个代表从起点到此节点本身之间所有的消耗值。

流程如下：

每次观察当前节点周围可抵达的节点，计算并赋予每个邻居他的消耗总值（当前节点的总消耗加上通过的消耗），并...]]></description><category></category></item><item><title><![CDATA[什么是引申音tension 以及什么是可用的引申音available tension]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/87541349</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/87541349</guid><author>zwlstc</author><pubDate>Sun, 17 Feb 2019 17:11:09 +0800</pubDate><description><![CDATA[我们知道和弦有其固有的色彩

小七和弦 可以表达忧郁 哀伤

属七和弦 可以表达矛盾 挣扎

大七和弦  可以表达愉快 冷静

基本和弦之所以可以表达这些情感是因为 所谓的guide tone （而所有和弦音1357被称作chord tone）

也就是3音和7音    3音7音和根音的关系决定了这个和弦的色彩

而仅作为chord tone 存在的1音和  5音  对和弦色彩的建立并没有什么卵用...]]></description><category></category></item><item><title><![CDATA[什么叫做和弦的同功能替代]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/87288969</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/87288969</guid><author>zwlstc</author><pubDate>Thu, 14 Feb 2019 18:44:57 +0800</pubDate><description><![CDATA[直接上结论

众所周知的251中

2能被 4  6替代

5能被 7 替代

1能被3 替代

至此同一个调性内 7个音级 都有了自己的功能类别

2 4 6姑且称为 下属功能组    5 7称为属功能组  1 3称为主功能组

这3种功能从直观来讲 对应 起承转合  （就像讲故事一样，好的故事一定有起始 高潮 收尾的那种感觉，对应和弦的3种功能）

于是 为什么能被替代？

原因同样非常直观
...]]></description><category></category></item><item><title><![CDATA[法向半球内单位向量(切空间) 转世界空间表示]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86652191</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86652191</guid><author>zwlstc</author><pubDate>Fri, 25 Jan 2019 21:53:49 +0800</pubDate><description><![CDATA[已知此切线空间的法线在世界空间中的表示N，求此切线空间构成的半球形空间任意单位向量(θ，φ)在世界空间中的表示

首先根据N,计算该向量所在切线空间另外两个正交基的世界空间表示。

先设一个临时向量Vtemp(0,1,0)        ( it works....)

则切线单位向量Vt = cross(Vtemp,N)    

副切线单位向量Vbt=cross(N,Vt);

然后，看图.....]]></description><category></category></item><item><title><![CDATA[Pbr和一般光照模型的区别]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86620028</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86620028</guid><author>zwlstc</author><pubDate>Thu, 24 Jan 2019 08:56:33 +0800</pubDate><description><![CDATA[pbr (physically based rendering) ，基于物理的渲染。

首先明确一点，物体有颜色是因为那些没有被物体吸收的光线(表现为物体的颜色)射入你的眼睛，你才感知到了颜色。从光照模型的角度来说，射入你眼睛的有两种光，一种是直接的反射光(表现为光本来的颜色)，一种是折射进入物体后又散射出来的所谓漫反射光(即被吸收过了的光，也就是贴图的颜色)

pbr和原始的blinn-phon...]]></description><category></category></item><item><title><![CDATA[用人话解释 格拉姆-施密特正交化 gram-schmidt process]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86615575</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86615575</guid><author>zwlstc</author><pubDate>Wed, 23 Jan 2019 18:36:26 +0800</pubDate><description><![CDATA[不管谷歌还是百度，这个关键词搜出来的内容都太学术了，废了点功夫才搞懂这东西有什么用。

下面用人话解释一下。

结论:  任意给定两个向量V1 V2，就可以两个向量组成的平面为基准，构建三个正交基a b c



首先，a向量通过单位化v1获得，然后计算v2在v1上的投影v3(dot)

b向量通过单位化  v2-v3的差 来获得

最后c  通过a 和 b叉乘得到。

 ...]]></description><category></category></item><item><title><![CDATA[直观理解SSAO原理]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86612359</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86612359</guid><author>zwlstc</author><pubDate>Wed, 23 Jan 2019 17:29:03 +0800</pubDate><description><![CDATA[SSAO ，screen space ambient occlusion  屏幕空间环境光遮蔽。

一般光照模型中，环境光用于模拟光线的二次散射，从而使得不受直接光照的地方也能有相应的亮度。

很明显，犄角旮旯里，不应该有太多的光被散射出来，所以犄角旮旯和露出表面的环境光不应该相同。

而在光照模型中，环境光是一个定值。

所以ssao出现了，他解决的就是 如何定量犄角旮旯应该吸收(二次散射不出去...]]></description><category></category></item><item><title><![CDATA[视差映射   Parallax Mapping]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86600762</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86600762</guid><author>zwlstc</author><pubDate>Tue, 22 Jan 2019 20:52:38 +0800</pubDate><description><![CDATA[这种技术和法线贴图结合使用，可以给物体表面增加惊人的细节，这边只谈实现上的注意点。

首先是最简单的一种，一般不会采用的那种，但用来理解最核心的思想是极好的。



（视差映射在实现时，通常采用的是深度图而非高度图，储存的信息是当前像素凹下去的程度）

如图所示，A点即是当前片元着色器正在处理的片元位置。如果不应用任何视差映射技术，则此时应该用A的uv值去相关贴图里采样。但，现在为了体现这个点的位...]]></description><category></category></item><item><title><![CDATA[ShadowMap 中的  Shadow Asne]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86591056</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86591056</guid><author>zwlstc</author><pubDate>Tue, 22 Jan 2019 11:31:59 +0800</pubDate><description><![CDATA[阴影技术中最简单的一种（其他的可以算作他的变种）是所谓的shadow mapping（适用于平行光）

他需要事先为场景中的物体，在以光源为视角的视口内，渲染一张深度图。

在那个视口里，只有最靠近光源的片元才能将自己的深度写入这张深度图。

随后，就正式开始渲染场景了。在正式的片元着色器中，需要先求出片元在光源坐标系内的位置，用xy当作uv坐标值去采样深度图里的深度值，同时用z值和这个深度值比较...]]></description><category></category></item><item><title><![CDATA[Gamma矫正，先有鸡还是先有蛋的故事]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86568412</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86568412</guid><author>zwlstc</author><pubDate>Mon, 21 Jan 2019 10:52:22 +0800</pubDate><description><![CDATA[先上图

 

此图出于LearnOpenGl CN。原文可能由于翻译的关系，导致内容其实并不好理解。翻阅了不少资料后（其实就是冯乐乐老师的入门精要，逃...），想对gamma矫正做一个简单的总结。

先剖析一下这张图的含义（此图其实不是重点）。首先，横轴代表，给计算机提供的颜色的物理强度rgb（图片上储存的信息或是shader的输出），纵轴是计算机实际会为这个值提供多少物理强度

中间直的小点虚...]]></description><category></category></item><item><title><![CDATA[浅谈Batch  SetPass 以及 Shader Material Texture的关系]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86550113</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86550113</guid><author>zwlstc</author><pubDate>Sat, 19 Jan 2019 11:47:24 +0800</pubDate><description><![CDATA[简单总结一下这些东西和opengl对应概念之间的关系。

首先unity 将glDrawElements这样的调用 称作一次Batch(以前叫Drawcall)，

将对于GPU来说比较昂贵的操作称作 SetPass

昂贵的操作是指哪些呢？ 

更换Shader  以及 更换Texture

还有一个不太确定，就是传递Uniform变量，猜想所谓的MateiralInstance（比如脚本中获取...]]></description><category></category></item><item><title><![CDATA[什么是ECS + Job]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/86347528</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/86347528</guid><author>zwlstc</author><pubDate>Sat, 12 Jan 2019 13:27:48 +0800</pubDate><description><![CDATA[单纯的ECS其实对性能提升并不大，那为什么Unity要推ECS，而且1年后铁定抛弃原来的Mono架构？（并不是完全抛弃，UI上任然会使用原来那一套）

因为ECS天生的多线程友好。搭配上Unity的JobSystem，轻松占满100%的Cpu，让cpu全速工作（在多核年代，占满CPU意味着牛逼）。如果到时候你还不会ECS+Job，只能干瞪眼。

好了，接下来要说明的是 ECS 是什么 以及为什么对...]]></description><category></category></item><item><title><![CDATA[协程VS多线程 应用场景比对]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/85988758</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/85988758</guid><author>zwlstc</author><pubDate>Mon, 07 Jan 2019 10:44:35 +0800</pubDate><description><![CDATA[众所周知 ，多线程除了会给cpu带来切换上下文的开销，还会产生资源竞争，想要用多线程，免不了这里那里加个锁。

所以多线程在有些时候并不讨巧。

所以，协程出现了，他也可以并发的执行多线逻辑，但完全不会给cpu带来额外负担，且不存在任何资源竞争。

看起来，协程可以完美替代多线程了。

但其实，协程也只是在特定应用情境下才适用。

使用多线程的目的之一是为了不阻塞主线程的迭代循环，让主线程可以顺畅...]]></description><category></category></item><item><title><![CDATA[CLR via C# 笔记 ----Task(任务) 2]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/85149234</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/85149234</guid><author>zwlstc</author><pubDate>Fri, 21 Dec 2018 00:18:07 +0800</pubDate><description><![CDATA[Task的取消

CancellationTokenSource用来取消Task，可以为Task的构造函数传递一个此类的实例。

当调用实例的cancel方法时，Task会被提意取消

为何说是提意，因为取消是协作式的，也就是说你这边提意了，Task的工作函数里还必须显示的写一点响应逻辑才能真正的取消执行。在工作函数内部，通常在一个循环内，持续调用CancellationTokenSource实例...]]></description><category></category></item><item><title><![CDATA[CLR via C# 笔记 ----Task(任务) 1]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/85121418</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/85121418</guid><author>zwlstc</author><pubDate>Thu, 20 Dec 2018 15:51:11 +0800</pubDate><description><![CDATA[直接给线程池添加工作项的方式很直接，但是无法得知工作项何时结束，并且不能获得返回值

于是，CLR提供了一个Task类封装了工作项

以下三种写法某种意义上来说是等价的


  //1作为object传递（仅仅是举例的作用），当回调需求一个ojbect参数时，需要额外传递这个参数
        ThreadPool.QueueUserWorkItem(DoSth,1);
        new ...]]></description><category></category></item><item><title><![CDATA[CLR via C# 笔记 ----线程基础]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/85115250</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/85115250</guid><author>zwlstc</author><pubDate>Thu, 20 Dec 2018 12:47:01 +0800</pubDate><description><![CDATA[在Windows中，进程是对应用程序需要的资源（内存）的抽象，就好像程序正在独占着这些资源（虚拟内存）一样

线程是对运行应用程序的cpu的抽象，就好像这个程序正在独占着这个cpu一样（然而此线程 会被其他线程抢占）

在Windows中，进程是十分昂贵的，创建一个进程要花几秒钟的时间，必须分配大量内存且初始化，EXE和DLL文件

必须从磁盘上加载，等等。相反，在Windows中创建线程则相对廉...]]></description><category></category></item><item><title><![CDATA[什么是四种七和弦 和三种转位]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/84985547</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/84985547</guid><author>zwlstc</author><pubDate>Thu, 13 Dec 2018 16:20:31 +0800</pubDate><description><![CDATA[七和弦简单来说就是 4个音一起出现，他们会以其中的一个音为根音,其他3个音以某种规律排列在根音周围

（一个喜欢刨根问底的同学问道：...为什么和弦只有4个音 不能是5个，6个，7个，8个？

老师无奈的回答: 因为老师的一只手张不开那么大...）

先上图

我们以F这个键为起点，找他的四种七和弦



第一种  Fmaj7      (大七和弦)    

规律：从F开始数  第0个 第4个 ...]]></description><category></category></item><item><title><![CDATA[UniRx---源码阅读提示 FromCoroutine]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/84979567</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/84979567</guid><author>zwlstc</author><pubDate>Wed, 12 Dec 2018 22:18:11 +0800</pubDate><description><![CDATA[先上函数


  public static IObservable&amp;lt;Unit&amp;gt; FromCoroutine(Func&amp;lt;IEnumerator&amp;gt; coroutine, bool publishEveryYield = false)
 {
    return FromCoroutine&amp;lt;Unit&amp;gt;((observer, cancellationToken) =&amp;...]]></description><category></category></item><item><title><![CDATA[Unity--- 简单模仿一下原生协程的实现]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/84975264</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/84975264</guid><author>zwlstc</author><pubDate>Wed, 12 Dec 2018 16:41:25 +0800</pubDate><description><![CDATA[先来看下测试代码 ...


 void Start()
    {
        CoroutineManager.Manager.StartCorouine(testWaitTime(1));
        CoroutineManager.Manager.StartCorouine(testWaitTime(2));
        //CoroutineManager.Manager....]]></description><category></category></item><item><title><![CDATA[UniRx---Subject  ReactiveCommand]]></title><link>https://blog.youkuaiyun.com/zwlstc/article/details/84965448</link><guid>https://blog.youkuaiyun.com/zwlstc/article/details/84965448</guid><author>zwlstc</author><pubDate>Wed, 12 Dec 2018 10:21:49 +0800</pubDate><description><![CDATA[先说前者Subject&amp;lt;T&amp;gt;

相当于是一个事件（通常在UniRx中理解成发射源）, 调用OnNext（t）可以给自己的订阅者发射T类型的数据

而接收者可以用UniRx的操作符对发射进行各种过滤、拼接、转换 。 这即是subject优于传统事件的地方。

后者 ReactiveCommand&amp;lt;T&amp;gt; 本质上仍然是一个Subject&amp;lt;T&amp;gt;

他通过调用Excute...]]></description><category></category></item></channel></rss>