几何海洋实现
整部纪念碑谷中我最感动的部分其实就是这片海。即使继续向前会沉到海中,但是图腾依然在奋力向前,渴望追上纪念碑的步伐:
实际上,在很多low poly风格的游戏中都有出现类似的几何形状的海洋(上图),非常可爱。在Unity的官方论坛中给出了一种利用脚本修改mesh的方法:https://answers.unity.com/questions/726932/low-poly-water.html 效果如下所示:
效果不错,但是有个问题也是很显著的,那就是法线并没有被重新计算。在代码里加上重新计算完法线之后,我换了个PBR的半透明材质:
至少对光照有反应了,但是效果却非常暧昧,并没有得到三角形每个面颜色分明的效果。后来我又试了渐变纹理的方法,但是效果依然很不尽人意。在走投无路的时候我找到了asset store的LowPoly Water:https://assetstore.unity.com/packages/tools/particles-effects/lowpoly-water-107563 。好吧我承认我不行,不过把别人家代码撕开看看还是会的。首先做几个猜想:
利用s ...
全局渐变效果实现
我想试着实现一下下图中纪念碑谷中的全局渐变的效果。关于如何实现这种渐变效果之前和别人讨论过,一开始我认为是通过从下往上打光来实现的,后来同学说是利用了shader和雾。利用后者实现的效果更为缓和,而利用光照可能会造成底部过亮的问题,不好控制。
为什么我管这种效果叫“全局渐变”呢?因为当我移动模型的时候,渐变的范围并不是固定在模型身上的,而是在世界空间的“某个位置”(如下图所示)。实际上,我们可以自行规定这个渐变地平线的位置,只需要在shader里加个控制变量就可以了。
实现变量首先,我们需要这么几个变量:
顶部的颜色
底部的颜色
渐变混合的程度
光照的强度
渐变地平线
渐变纹理
1234567891011121314Properties{ // 光照的强度 _Contrast("Contrast",Range(0,1))=0.1 // 渐变纹理 _RampTex("渐变纹理", 2D) = "white"{} ...
程序棋盘格效果实现
为什么会写这篇文章呢…因为我已经在大大小小的场合中遇到三次相关的题目了,前几次答得挺不尽人意的。第一次是在剑心互娱的校招笔试上,要求画一个黑灰白三条杠(下左),第二次是字节的二面要求画一个棋盘格的效果(下右),还有一次忘了(
对于这两种效果,我们的思路其实是一样的(棋盘格只需要多一步加法)。
开始绘制 怎么用程序画东西呢?我们在做材质的时候似乎一直是基于贴图进行处理的。实际上,我们是可以直接对纹理映射(texcoord节点)下手的,如果将其连接到根节点的base color,我们会得到如下画面:
为什么是这个颜色?首先需要知道的是:texcoord只有uv两个量,而颜色具有三个分量。当我们默认第三个分量为0时,就会得到上述的颜色信息。而如果我们把第三个分量设置为1,就会得到:
数学处理黑、灰、白 为了实现三条边、四条边甚至多边的情况,我们需要对texcoord进行缩放,这一步很简单,只需要让texcoord乘上一个用来控制的常量:
然 ...
菲涅尔反射实现边缘光效果
在之前的项目中,我从网上抓了一个用菲涅尔反射写的边缘光shader。经过自己的魔改之后,加上了法线等用在后续的项目中。现在我们回过头来探寻一下菲涅尔效应是如何用来实现边缘光的。
参数
我们有三个至关重要的参数:边缘光的颜色、边缘光强度和强度系数。
边缘光颜色这个没什么好说的,就是控制边缘光的颜色。但因为是光,所以当颜色调整为黑色时不论强度多少都是看不到效果的。
边缘光强度这个值可以控制菲涅尔影响范围的大小,这个值越大,效果上越边缘化(上:强度为1.5;下:强度为4)。
边缘光强度系数这个值控制菲涅尔反射的反射强度,值越大,反射越亮,反之越暗(上:强度为1.5;下:强度为12)。代码里的注释有错,因为原先的代码的强度系数在内部被原作者定死了。
片元着色器边缘检测这一步是实现边缘光效果的核心。首先我们来理清一下思路,如何进行边缘检测?其实很简单的一种方式就是通过视线方向和片元的法线方向点乘进行判断。当我们差不多正视一个片元的时候,夹角通常都是小于45°的。而片元越靠近边缘,与视线的夹角越大,最终达到视线相切的90°,再大就看不到了。所以我们对视线和片元法线归一化之后进行点乘, ...
解决Z-Fighting
解决Z-FightingZ-Fighting是在实际项目中困扰到场景布局的一大因素。从理论上来说,在相同深度值的地方有多个片元,这导致颜色缓冲区不知道该呈现哪个颜色比较合适,而当视角运动时就会出现糟糕的闪烁:
通过调整渲染队列并不能避免这种问题,就比如上图的半透明物体的渲染队列是在不透明物体之后的,但他们重叠时依然会发生z-fighting现象。
解决方法Shaderlab语法中的Offset命令
12345678910Properties{ _OffsetFactor("深度斜率",Float) = 0 _OffsetUnit("深度偏移",Float) = 0 }SubShader{ Pass{ Tags{ "LightMode" = "ForwardBase" } Offset [_OffsetFactor],[_OffsetUnit] } ...
Oculus Quest电脑端有线连接教程
由于无线连接需要代理路由或代理wifi,所以走有线本篇教程使用github作为图床,使用代理来加载图片本教程的前提是你的设备已经激活并且连上手机。激活需要代理热点,比如刷了老毛子固件的路由器或者坐船去台湾,也可以通过oculus helper、SSTap等来实现
基础步骤安装Oculus电脑客户端从官网上下载Oculus Hub,点击oculus setup就可以直接安装,如下(如果你是开发者,可以安装Oculus Developer Hub):安装建议使用科学上网,一个好的代理可以在半小时内下完5G多的资源,否则要五个小时。安装好之后桌面上会出现客户端图标:这时候使用之前注册的开发者账户登录会出错,原因是国内墙的dns污染导致无法连接oculus的服务器。解决方式是打开电脑文件目录:
1C:\WINDOWS\System32\drivers\etc
里面有一个hosts文件,以记事本打开它,在末尾加上:
123157.240.217.51 graph.oculus.com157.240.195.51 graph.oculus.com157.240.199.54 graph.oculu ...