![](https://img-blog.csdnimg.cn/20210421224151954.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Unity3D渲染
文章平均质量分 78
Unity3D Shader相关
Marco&GalaxyDragon
这个作者很懒,什么都没留下…
展开
-
Unity模糊后处理详解
在unity中各种模糊后处理的实现原创 2022-10-23 16:32:29 · 4209 阅读 · 1 评论 -
Unity3D Dither 抖动Shader实现
概述之前写过一篇去色shader,大致就是使用一种类似区间划分的方法来将原来图片所使用的颜色离散化,来达到一些特殊的视觉效果。使用之前那个shader,将颜色数量减少到两种的时候,效果如下,已经完全看不出原图是什么东西了。我们今天使用一种特殊的dither抖动 shader,来实现只用两种颜色但依然能保证一定的图片细节的效果。先看看效果,下图只使用了纯黑或者纯白两种效果,虽然依旧很模糊,但效果比上面那张图要好的太多了。可能有人不相信这张图只使用了两种颜色的(我一开始也没有相信),我们这里截取局原创 2021-10-04 15:53:27 · 3323 阅读 · 2 评论 -
Unity3D 去色Shader实现
一般为了达到一些特殊的渲染效果会降低纹理所使用的颜色数量,不管是在后处理里实现还是对单个物体实现,思路都是差不多的。在unity里颜色值分量可以看成[0,1]的连续值,但是其实也只能取到256个值,因此可以直接把[0,1]的值无损的映射到256个格子里,然后再根据需要,对这256个格子进行一定的合并,例如[0,9]原来是10种颜色,现在用0代表的颜色代替。[10,19]用10这种颜色代替,依次类推。关键代码,_DiscreteLevel为需要用的颜色数量,我们这里使用向下取整,因此所有落在这个区间内的颜原创 2021-10-04 14:52:00 · 1444 阅读 · 0 评论 -
Unity3D 双面渲染Shader实现
概述在建模软件中可以为每个顶点设置法线,三个顶点可以组成一个三角面,三角面的法线是根据其顶点的法线插值而来,这个法线朝向就代表了这个平面的正面。而在现代大部分引擎和游戏中,会默认只显示平面的正面,即对每个三角面进行一次面法线和摄像机出射向量的点积,判断正负,如果当前平面是背面朝向摄像机,则不渲染该面片。Unity 的standard shader就是这样,我们只要创建一个平面就能看出这种效果。创建一个平面,默认此平面正面朝上。我们调整角度从下往上看,平面完全不渲染了。除了一个选中的什么都看不见(原创 2021-10-04 12:11:42 · 7791 阅读 · 0 评论 -
Unity3D TriPlanar三平面映射 Shader实现
TriPlanar是一种不需要uv的纹理贴图技术,国内好像没有标准的译名,这里暂时称为三平面映射。那为啥模型会没有uv呢。。这个很简单,有的可能就是单纯模型师忘了做,比如你去网上下模型之类的。不过TriPlanar最重要的用途还是跟程序化生成地形有关,程序化生成地形是比较难对顶点设置uv坐标的。有的人可能会觉得地形就是一个四边形嘛,从对角线设置[0,0]到[1,1]直接覆盖一张纹理不就好了吗,有一些古老的游戏确实是这么做的,甚至一些现代引擎的地形编辑工具都会默认这么做(比如unity),但是这种作法会在原创 2021-10-04 11:38:20 · 2193 阅读 · 0 评论 -
Unity3D 视差贴图(Parallax Mapping)Shader实现
概述视差贴图简单来说,就是和法线贴图功能类似的一种东西,但是他解决了某些情况下法线贴图可能会出现的一些视觉错误。先回忆一下法线贴图的作用,一般游戏开发中用的模型是先在建模软件中建一个高面数的精细模型,但是由于性能问题,这个模型不能直接导出在游戏中使用,所以需要导出一个优化过的低面数的模型。但是低面数模型的光照效果肯定没有高面数模型那么精细。一般光照效果都是依赖法线来计算,所以有人就想出了低面数的模型加上高面数模型的法线贴图,然后光照计算用的法线就用高面数模型的法线。这样就能达到高面数模型的光照效果了。原创 2021-09-15 00:11:12 · 3317 阅读 · 1 评论 -
Unity3D 2D水面倒影的实现
项目中需要加入一个水面倒影的效果,而我现在这个项目是2D的,2D的话倒影比3D要好做的多,只要用grabpass抓取屏幕,uv取反,加上一个偏移值,最后用一个三角函数对uv坐标进行偏移就好了效果如下(gif有点糊)参数面板完整代码Shader "LX/postDistortion"{ Properties { _Color ("Color", Color) = (1,1,1,1) _DistortionScale ("DistortionSc原创 2021-09-14 22:28:05 · 1680 阅读 · 1 评论 -
Unity3D 简单水面shader的实现
实现思路今天来实现一个简单的水面效果。水面的话主要是以下几个效果叠加1.水面的动态波浪效果,我们这里使用最简单的正弦波加上法线贴图来模拟。如果想要更精确的波动效果可以考虑使用Gerstner波2.不同水深颜色不同的效果,使用该顶点深度和顶点坐标的差值来计算深度,然后映射到颜色3.浪涌效果,还是根据顶点深度和顶点坐标的差值来计算深度,然后叠加上一层浪涌4.折射效果,用grabpass,采样之后进行偏移,最后叠加上去。代码实现首先是顶点位移函数,使用正弦函数代入顶点的x坐标和z坐标来算,因为这里写原创 2021-09-14 21:46:01 · 8622 阅读 · 4 评论 -
Unity3D 选中高亮效果shader的实现
实现思路平时我们可能觉得shader就是单纯用来进行渲染的,不会和逻辑代码产生什么交互,但是如果要做这种高亮的效果就需要使用代码来控制shader的显示了。所以物体选中高亮效果的实现其实就很简单,先写一个shader表现高亮效果,然后用另外一个代码文件来控制这个shader的参数就好了。代码实现高亮shader我们这边就简单写一个rim效果。我们这里把rim效果加在Emission上只是为了修改方便,如果原来已经有了一个shader,然后需要给这个shader添加高亮的效果,只要把这个最后算出来的原创 2021-09-13 23:12:30 · 4732 阅读 · 2 评论 -
Unity3D 肥皂泡shader的实现
实现思路今天来写一个肥皂泡的shader,虽然最后出来的结果不太像。。但是还是简单讲一下思路好了。一般写shader的话先从现实生活找找参考,肥皂泡的话首先形状不是标准的球形,而且在移动的过程中外形会改变,因此我们需要写一个顶点偏移函数。接着就是肥皂泡表面上的薄膜干涉效果,使得肥皂泡表面表现出来就是花花绿绿的。这种光学效果要真的靠计算光线去模拟的话不太现实,因此就用一张渐变贴图加上一张噪声图来模拟。然后就是很常见的rim效果,这个只用计算出来之后叠加上去就可以了。最后就是反射和折射,反射的话用表面原创 2021-09-13 22:50:00 · 1442 阅读 · 0 评论 -
Unity3D Tessellation曲面细分
实现思路回忆一下现实生活中的雪,在一个时间段内大致是从一个方向吹的,面朝吹来方向的表面会被沾上雪,背向雪吹来方向的表面则不会被沾上雪。这样听起来就和光照的处理方式非常像,因此我们就大致用lambert光照的处理方式来处理雪覆盖的效果。指定一个方向作为雪的方向,计算顶点法线和雪方向的点积,作为混合因子,然后用该混合因子混合正常颜色和雪颜色,以及正常法线和雪的法线。代码实现在顶点着色器中最重要的就是保存了切线空间到世界空间的变换矩阵 o.ToW0 = float4(wor原创 2021-09-13 21:27:42 · 1940 阅读 · 0 评论 -
Unity3D油画滤镜shader的实现
原图添加后处理效果后实现思路是对每一个像素点,采样它周围的四块矩形区域的均值,并选取各像素颜色分量色差最小的均值作为该像素点的颜色。从而既可以达到一种模糊效果,又可以对画面进行柔化。(中间的是像素着色器当前要执行的像素,每个像素需要采样1234四个区域)具体的计算过程是先计算该像素点周围四块矩形每个矩形区域内的所有像素颜色的均值的平方,接着计算所有像素颜色的平方的均值。然后求差值,那么什么时候这两个值差距最小呢?大家可以列式计算一下,推导也比较复杂,结果就是这一块区域内每个像素的颜色互相更接近原创 2021-04-17 18:15:14 · 1414 阅读 · 1 评论 -
Unity3D像素化滤镜shader的实现
实现思路像素化就是使许多相邻像素都变成一个像素,自然看上去就会有像素化的效果了。根据这个思路,马上可以想到一种做法就是将屏幕分成若干个区域,每个区域由若干个相邻的像素组成,每个区域都是一个正方形,然后计算正方形的卷积作为这个区域的颜色。这种做法会稍微麻烦一些,今天我们写的这个shader单纯采样了这个区域里的一个像素代表这整个区域的颜色。可能听上去有些不靠谱,但是实际看起来还是效果不错的,毕竟都是像素化效果了,有些误差说不定还会更好看一些。代码实现编写一个函数传入uv返回颜色,我们这个先把uv转原创 2021-04-17 15:38:29 · 2329 阅读 · 2 评论 -
Unity3D 旧电视滤镜shader的实现
实现思路既然是要实现旧电视的后处理效果,那么只要回忆一下那些古旧的电视的显示效果然后进行模拟就可以了。1.首先那种大头电视一般屏幕有一些曲率,并不是完全的一个平面,而且一般是向外凸起,这种凸起会造成中间的显示区域会比原来更近一些,边缘的显示区域会比原来更远一些。这种效果我们直接用简单的二次函数来实现。2.那种老旧电视会有不断运动的噪声,我们直接使用噪声函数加上时间变量来实现。3.屏幕上会有一些条纹效果,这种周期性的条纹效果一般用三角函数来实现。当然不可能模拟的完全准确。。也没有完全准确一说。毕竟每原创 2021-04-17 11:15:18 · 1566 阅读 · 3 评论 -
Unity3D漫画纸张后处理shader的实现
实现思路大致思路就是在屏幕空间对亮度值进行采样映射,将亮度值离散化为若干个区域,之后对应成不同的颜色,之后还需要再进行一遍处理,让画面有一种呈现在特殊漫画纸上的效果,比如网点纸。有一个要点就是亮度值如何计算,我们都知道漫反射光照模型可以得出亮度值,有一些非真实感渲染就是使用这个值来进行离散化处理的。如Unity shader卡通化着色器的实现但是我们这里需要注意的是屏幕空间对亮度值获取和用漫反射光照模型获取亮度值,两者出来的效果是完全不同的。根据漫反射光照模型获取某个顶点的亮度值,是不考虑贴在这个原创 2021-04-16 17:05:04 · 1487 阅读 · 0 评论 -
Unity shader bloom效果的实现
实现思路首先提取一张图像的亮度,进行模糊之后(高斯模糊或者其他模糊方法),覆盖到原图上。因此需要好几个pass来实现,一个pass提取亮度,两个pass进行高斯模糊,最后一个pass混合两张图。代码实现提取亮度就把像素亮度和阈值比较,高于阈值则提取,低于阈值设为0。 fixed4 fragExtractBright(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uvMain);原创 2021-04-14 21:29:48 · 516 阅读 · 1 评论 -
Unity shade高斯模糊的实现
实现思路模糊效果分为很多类型,如均值模糊,高斯模糊等等,模糊效果的实现都是对每一个像素,取它附近的一些像素,进行一些平均化的操作。因此每个像素和附近像素的差异就变小了,整个图也就变模糊了。高斯模糊的做法是用二维正态分布,来计算每个每个像素应该占用的权值。而二维正态分布可以分成两个一维正态分布来计算。代码实现按思路实现即可,我们这里取横竖各五个像素来计算高斯模糊,当然也可以取更多的像素,只要根据正态分布函数计算出对应权值即可。因为正态分布是一个偶函数所以我们这里也只用声明半边的权值。注意这里权值的总原创 2021-04-14 20:56:36 · 512 阅读 · 0 评论 -
Unity3D边缘检测滤镜shader实现
实现思路在屏幕空间下怎么判断一个像素点是边缘点呢?可以回想一下边缘点的特征,即边缘点附近一般亮度变化大。比如一个物体内部和背景的亮度,在边缘处一般会有肉眼可见的突变,我们只要检测出这种变化就能检测出边缘了。检测方法就是取这个像素周围的一些像素,计算他们的亮度值之后进行比对,如果周围像素亮度值差异大,则判断为边缘,这也就是俗称的‘卷积’。当然在屏幕空间进行边缘检测总会有不准确的地方,这个是无法避免的。代码实现最重要的就是计算一个像素当前梯度值的函数了,这个梯度值就代表该像素附近像素的亮度变化,越大就代原创 2021-04-14 11:15:15 · 519 阅读 · 0 评论 -
Unity3D简单体积光的实现
实现思路为了实现一个简单的体积光效果,我们直接把模型背面的顶点按照光照方向挤出一定距离,再按照距离对颜色进行插值,就可以实现简单的体积光效果代码实现首先体积光是一个半透明效果,所以关闭深度写入,打开混合。在顶点着色器中判断顶点是不是背面,这里直接用光线方向和法线点积,如果小于0就是背面。这里点积小于0我们设置为1,是为了接下来进行挤出,1代表需要进行挤出的意思。float3 toLight = ObjSpaceLightDir(v.vertex);float extrude = dot(toL原创 2021-04-12 19:49:20 · 1918 阅读 · 1 评论 -
Unity3D简单体积雾的shader实现
体积雾普通雾的实现是在每个着色器(例如unity 的stanard着色器)中都添加一段雾的代码,然后根据顶点离摄像机的距离来覆盖一层颜色达到一种雾的效果。而体积雾是一个有体积的雾,其本身是一个对象,在场景的中空区域也可以有雾的效果。两者主要区别如下:1.普通雾需要更改所有的着色器,而体积雾只用为体积雾对象写一个着色器。2.普通雾可以看成是一层纹理贴在场景的物体上,而体积雾本身具有体积,在普通雾覆盖不到的地方(比如没有任何物体的空场景),也可以添加雾的效果。实现思路用来生成体积雾的模型一般都是简单原创 2021-04-12 14:49:58 · 4203 阅读 · 6 评论 -
Unity3D消融效果shader实现
实现思路消融效果首先需要一张噪声图,噪声图可以用一些软件来生成例如ps,也可以自己写噪声算法来生成。获得噪声图之后,在shader中对噪声纹理的亮度值进行采样,丢弃小于阈值的片元。还需要添加一些补充效果,例如表现烧焦的边缘之类的,这也可以通过一个亮度的比较再加上插值来完成。噪声图简单起见,我们直接使用PS来生成,打开PS的工具栏。滤镜->渲染->分层云彩。之后再添加图层进行一些调色,得到我们使用的噪声图。如果想要自己来生成噪声图,也可以查阅perlin噪声算法相关的资料。clip原创 2021-04-10 18:38:33 · 648 阅读 · 0 评论 -
Unity3D卡通效果的shader实现
卡通着色器的实现一般是描边加上一张渐变贴图对顶点亮度值进行离散化,按照此思路我们在unity shader里来进行实现。描边在shader里对模型进行描边有好几种思路。第一种是使用屏幕后处理,用一个卷积来查找物体边缘部分并进行描边着色,不过效果并不好,在只能得到图像数据的情况下又需要进行描边才这样处理。如果可以直接得到模型数据,当然是直接用模型数据进行处理。用模型数据进行描边也有好多种思路,例如获取摄像机法线纹理对相邻顶点的法线进行点积,角度超过阈值就判断为边缘部分。我们这里还是用最简单的一种方式原创 2021-04-10 18:00:30 · 1211 阅读 · 0 评论 -
unity shader渐变纹理卡通化着色效果
有时纹理贴图的作用不仅仅是给模型贴上一层“外衣”,一些其他的效果也可以使用贴图来完成,比如使用渐变纹理来使物体有一定的卡通化效果。回想一下看过的一些动画就可以知道,动画里人物的绘制的明暗区域的过渡非常直接,如下图,可以看到几乎不是纯黑就是纯白。那么我们也可以在unity shader中实现大致的效果,主要思路就是制作一张渐变纹理。然后使用phong光照模型中的漫反射公式,即法线点乘光照方向,来得到一点的亮度信息。此时如果直接使用此亮度信息,就会得到一个过渡十分均匀的效果,那么为了得到动画中几乎没有明原创 2021-02-18 12:53:25 · 674 阅读 · 1 评论 -
unity shader法线贴图实现凹凸映射效果
法线贴图法线贴图是一张保存了物体法线信息的纹理,可以用来细化模型的光照效果。例如一块石头表面坑坑洼洼的,如果全部用建模实现,需要非常多的顶点数和面数才能完成。但是做一个简单的模型,比如表面平整的一块石头,然后使用法线贴图来重设顶点的法线,在远处观看也能得到相当接近的渲染效果。同时只需要简单模型的顶点数和面数,提高了帧率,所以法线贴图其实可以看成是在模型面数和帧率之间妥协的产物。那么知道了法线贴图就是保存了物体法线信息的纹理,法线贴图从哪里来呢?首先3D软件中一般都可以在模型上生成法线贴图,此时用到的原创 2021-02-17 23:23:34 · 1738 阅读 · 0 评论 -
unity shader实现纹理贴图
unity实现纹理贴图很简单,首先在appdata结构体里声明uv语义,就可以获得当前顶点的uv坐标,对外部导入的模型来说。这个uv坐标是在3d模型软件例如maya中制作模型的人预先设定好的。我们只需要把他获取过来就行了。 struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };既然需要纹理贴图,要么肯定要原创 2021-02-17 19:35:21 · 1684 阅读 · 0 评论 -
unity shader 实现blinn-phong光照模型
接着上一篇说上一篇 phong光照模型blinn-phong模型只改动了phong模型中的高光部分不使用光的反射方向而是引入一个新的变量,光照方向加上视角方向之后归一化。而计算高光也不是使用视角方向点乘光线反射方向,而是使用法线方向点乘这个新引入的变量完整代码如下Shader "Test/Blinn-Phong"{ Properties { _Color("Color",Color)=(1,1,1,1) _EmissiveColor("Emiss原创 2021-02-17 18:49:57 · 654 阅读 · 0 评论 -
unity shader 实现phong光照模型
phong光照模型phong光照模型是一个经验模型,并没有理论依据,只是说“看起来能像那么回事”。优点当然是计算量很小,因为所用的公式都很简单,而且基本只要知道一些简单的属性就可以计算,比如坐标啊,光源方向啊,法线啊、完全不用模拟单条光线的路径之类的。缺点就是比较粗糙,而且也没有办法模拟多次反射的效果。目前在游戏领域不是光线追踪比较火嘛,因为以前的硬件没有那么高的算力来做光线追踪,在光线追踪之前就是这个经验模型及其变体运用的最广了。phong光照模型把光线分为四个部分处理,分别是环境光,自发光,漫原创 2021-02-17 18:36:54 · 1518 阅读 · 0 评论