观察者模式 官方定义: 观察者模式属于行为型设计模式。它的标准定义是:“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。” 听起来可能有些抽象,接下来我用人话给大家拆解一下。 传统写法痛点:紧耦合地狱 假设我们要写一个天气系统,有一个用来获取数据的 气象站类,还有一个负责展示的 手机类。 在没有学习设计模式之前,为了在手机里展示天气,我们通常会直接在手机类中声明并实例化一个气象站对象来获取数据。但问题来了:现实中可能有成千上万部不同的手机!如果每部手机都直接绑定气象站的具体实现,一旦气象站的内部结构发生变化,所有手机的代码都要跟着改。
移动控制的方案分类 按照是否受到物理影响分为非物理驱动和物理驱动还有就是混合方案。 非物理驱动(代码绝对控制) 这类方法不依赖刚体物理,直接移动物体。适用于没有真实物理交互需求,或需要绝对控制权的游戏,其最主要的方案为Transform和CharacterController。 1.Transform 原理:每帧直接修改 transform.position 或调用 transform.Translate()。 核心特征: 零物理开销:这是性能最极致的方式。 绝对精准:你设什么位置就是什么位置,没有惯性、没有重力、没有任何延迟。 完全无碰撞:会直接穿透任何物体,除非你自己写代码处理。
什么是插值函数? 插值是一种通过已知离散数据点来估算未知点数值的方法。简单说,就是“用已知点去推算两点之间某点的值”。 这个概念是插值的普遍概念,我们所使用的Lerp函数只指的是线性插值, 线性插值 原理:假设两点之间是一条直线。 公式: 在点 (x0,y0)(x_0, y_0)(x0,y0) 和 (x1,y1)(x_1, y_1)(x1,y1) 之间,求 x 处的 y: y=y0+(x−x0)⋅y1−y0x1−x0y = y_0 + (x - x_0) \cdot \frac{y_1 - y_0}{x_1 - x_0} y=y0+(x−x0)⋅x1−x0y1−y0
陡峭视差映射原理 朴素的陡峭视差只采样一次,陡峭视差映射基本想法是多次检测来获得比较精确的值。 主要方法是按照朴素采样得到一个总偏移量(因为交点一定不会超过这个偏移量)之后,将高度按步进次数分层数,计算每一步的偏移量,从得到的初始UV值,每一步原始UV值加上每一步的偏移量,原始高度加上每一步的分层值,然后采样得到贴图上的高度值,比较当前层数和高度值,可以发现当高度值小于层数一定是不相交的,靠这样步进可以得到一个较为精确的偏移值。 Shader代码实现 [title] [lang:Shaderlap] [url] [link text] [additional options]123456
开篇提醒 如果你对纹理相关的知识还不熟悉,建议查看实时渲染第四版的第六章,或者我之后会写的纹理相关文章,这里只针对如何实现法线映射和视差映射做讲解。 法线贴图和深度贴图 法线贴图是一张存储了模型切线空间下法线向量信息的贴图,而深度图就是存储了模型深度的信息。 这些信息就被我们利用算法计算出正确的法线,然后利用法线来计算光照模型。 视差映射配合法线贴图的原理 黑色是物体的实际表面,红色表示高度贴图表示的值。 有一个重点就是理解法线贴图的值在哪里?图上有A和B的两点表示在物体实际表面上的点,A和B点可以构建出切线空间,就是法线和切线和副法线为基向量构成的(橙色坐标系是A的切线空间),那么这个
开篇提示 从这篇文章起,之后的所以shader编写将会转为HLSL语言,CG已经有点过时了。 高光反射(镜面反射) 镜面反射是指若反射面比较光滑,当平行入射的光线射到这个反射面时,仍会平行地向一个方向反射出来,这种反射就属于镜面反射。 高光可以表示出一个物体表面的光滑程度,越光滑表面高光越强。可以想象一个球,有一个手电筒直接打在球上,球的表面越光滑,高光点越小越集中,越出超漫反射就越严重,高光点就越大。 其中关于高光反射的经验方程是 Lspecular=ks⋅I⋅max(0,V⋅R)nL_{specular} = k_s \cdot I \cdot \max(0, V \cdot R)^
什么是漫反射和辐照度(朗伯余弦定律)? 漫反射描述了这样一个物理现象:一束笔直的光照沿着直线打在粗糙的物体上,物体表面表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射。 辐照度是描述光照强度的一个物理量,是指是受照面单位面积上的辐射通量。 辐照度的计算公式有很多,但是我们只需要知道朗伯余弦定律公式就可以了 当光线以入射角 θ照射到表面时: E=En⋅cosθE = E_n \cdot \cos\theta E=En⋅cosθ 其中: E0E_0E0为法向入射时的辐照度 θ为入射角(光线与法线的夹角) PS:为什
菲涅尔效应是什么? 理解菲涅尔效应,你首先得知道在自然界中会发生反射和折射,而菲涅尔就是描述反射/折射与视点角度之间的关系。 举一个例子,假设有一个十分平静的水面,当你垂直看向水面的时候,反射是最强的,折射是最弱的,当年倾斜45度的时候,你能既能看到水下面的东西和天空的颜色,因为这时候反射和折射同时存在。 如何计算菲涅尔效应? Schlick菲涅尔近似等式: F(θ)=F0+(1−F0)(1−cosθ)5F(\theta) = F_0 + (1 - F_0)(1 - \cos\theta)^5F(θ)=F0+(1−F0)(1−cosθ)5 其中F0F_0F0是为法线入射时的反射率
人物建模概述1 对于建模的认识 不管对于人物建模或者是其他物体的建模,最终目的都是表达(做一个看起来很牛逼的效果图),从这个方面讲我们说的建模就不只是建模了,这时候的“建模”应该说的是模型制作流程。模型制作流程一般包含了建模 —>贴图制作—>渲染,经过这一个流程之后才形成了我们平时看到的展示图。如下图 需要注意的是渲染这个过程是一定伴随我们建模的整个过程的,因为有渲染我们才能从软件上看到我们的模型,我后期写shader相关的文档会介绍,知道渲染是有好坏的,好的渲染会让模型更好看就可以。 NPR与PBR npr和pbr是讲的两种渲染流程,分别指的是非真实感渲染和真实感渲染。为