Unity Shader
vvc223c
这个作者很懒,什么都没留下…
展开
-
Unity Shader 屏幕后处理使用噪声纹理实现全局雾效
原理:和之前的差不多,只是添加了噪声相关的参数和属性,并在Shader的片元着色器中对高度的计算添加了噪声的影响脚本实现using UnityEngine;using System.Collections;public class FogWithNoise : PostEffectsBase{ public Shader fogShader; private Mat...原创 2019-12-12 15:29:14 · 563 阅读 · 0 评论 -
Unity Shader素描风格的渲染
原理使用6张素描纹理进行渲染,在渲染阶段,在顶点着色阶段计算逐顶点的光照,根据光照结果决定6张纹理的混合权重,并传递给片元着色器。在片元着色器中根据这些权重来混合6张纹理的采样结果Shader实现Shader "Hatching" { Properties { _Color ("Color Tint", Color) = (1, 1, 1, 1)//颜色 _TileFactor ...原创 2019-12-12 15:11:53 · 507 阅读 · 0 评论 -
UnityShader屏幕后处理 利用深度纹理进行边缘检测
原理使用Roberts算子,计算左上角和右下角的差值,乘以右上角和左下角的差值,作为评估边缘的以具。在具体实现中,取对角方向的深度或法线值,比较它们之间的差值,超过某个阈值就说明存在一条边.脚本实现using UnityEngine;using System.Collections;public class EdgeDetectNormalsAndDepth : PostEffec...原创 2019-12-11 18:11:26 · 380 阅读 · 0 评论 -
Unity Shader屏幕后处理 全局雾效的实现
原理:根据深度纹理重建每个像素在世界空间下的位置,首先对图像空间下的视锥体射线进行插值,这条射线存储了该像素在世界空间下到摄像机的方向信息.然后,我们把该射线和线性化后的视角空间下的深度值相乘,再加上摄像机的世界位置,就可以得到该像素在世界空间下的位置。重建世界坐标只需要知道摄像机在世界下的位置,以及世界空间下该像素相对摄像机的偏移量,把它们相加就可以得到该像素的世界坐标float3 w...原创 2019-12-11 16:44:27 · 1348 阅读 · 1 评论 -
Unity Shader使用深度纹理实现运动模糊
原理利用深度纹理在片元着色器中为每个像素计算其在世界空间下的位置,使用前一阵的视角*投影矩阵对其进行变换,得到该位置在前一阵中的NDC坐标。然后,计算前一阵和当前帧的位置差,生成该像素的速度.脚本实现:using UnityEngine;using System.Collections;public class MotionBlurWithDepthTexture : PostEffe...原创 2019-12-11 15:24:23 · 382 阅读 · 0 评论 -
Unity Shader屏幕后处理 运动模糊
原理一种实现方法是利用一块累积缓存来混合多张连续的图像,当物体快速移动产生多张图像后,我们取它们之间的平均值作为最后的运动模糊图像。然而这种暴力的方法对性能的消耗很大.另一种应用广泛的方法是创建和使用速度缓存,这个缓存中存储了各个像素当前的运动速度,然后利用该值来决定模糊的方向和大小.我们使用类似上述第一种方法实现来模拟运动模糊的效果,我们不需要在一帧中把场景渲染多次,但需要保存之间的徐娜然...原创 2019-12-11 14:53:07 · 661 阅读 · 0 评论 -
Unity Shader屏幕后处理 Bloom效果
原理:首先根据一个阈值提取出图像中较亮的区域,把他们存储在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行模糊处理,模拟光线扩散效果,最后将其和原图像进行混合,得到最终的结果脚本实现:我们要使用4个Pass通道第一个Pass通道提取较亮的区域,存储起来第二个Pass通道进行垂直模糊第三个Pass通道进行水平模糊第四个Pass通道进行混合public class Bloom : Po...原创 2019-12-10 20:30:04 · 453 阅读 · 0 评论 -
Unity Shader 屏幕后处理灰度
原理:移除场景中除了黑白灰以外所有的颜色,让整个图像灰度化(Grayscale)。很简单的实现方式是,取所有的颜色分量,将它们平均化,但是但人眼会对绿色更加敏感一些,而对蓝色不那么敏感,所以为了获取物理上更精确的效果,我们需要使用加权的(Weighted)通道:脚本如下: public Shader shader;//相应的shader private Material ma...原创 2019-12-10 18:06:54 · 522 阅读 · 0 评论 -
Unity Shader 屏幕后处理反相
Shader代码如下: Properties { _MainTex ("Base (RGB)", 2D) = "white" {}//渲染纹理 } SubShader { Pass { ZTest Always Cull Off ZWrite Off CGPROGRAM #include "UnityCG.cginc" #prag...原创 2019-12-10 18:00:10 · 810 阅读 · 0 评论 -
Unity Shader屏幕后处理高斯模糊
原理利用卷积计算,使用的卷积核叫高斯核使用一个N x N的高斯核对图像进行卷积滤波,就需要N x N x W x H次纹理采样,当N的大小不断增加时,采样次数会变得非常巨大,不过我们可以把这个二维高斯函数拆分成两个一维函数.得到的结果是一样的。实现我们会先后调用两个Pass,第一个Pass使用竖直方向的一维高斯核进行滤波,第二个Pass使用水平方向的一维高斯核,得到最终的目标图像.首先...原创 2019-12-10 17:43:09 · 321 阅读 · 0 评论 -
Unity Shader屏幕后处理 边缘检测
原理利用边缘检测算子对图像进行卷积操作如何知道哪里才算是边缘呢?如果相邻像素之间存在差别明显的颜色、亮度、纹理等属性,我们就会认为它们之间应该有一条边界。这种相邻像素之间的插值可以用梯度来表示,边缘处的梯度绝对值会比较大.三种常见的边缘检测算子它们都包含了两个方向的卷积核,分别用于检测水平方向和竖直方向上的边缘信息,在进行边缘检测时,我们需要对每个像素分别进行一次卷积计算,得到两个方向...原创 2019-12-10 15:45:00 · 352 阅读 · 0 评论 -
Unity Shader 屏幕后处理调整亮度、饱和度、对比度
在进行屏幕后处理之前,需要检查一系列条件是否满足,比如是否支持渲染纹理和屏幕特效,是否支持当前使用的Unity shader等.所以需要创建一个基类,用来检查:屏幕后处理基类using UnityEngine;[ExecuteInEditMode]//ExecuteInEditMode属性的作用是在EditMode下也可以执行脚本[RequireComponent (typeof(Cam...原创 2019-12-10 14:26:36 · 773 阅读 · 1 评论 -
Unity Shader广告牌技术
原理:构建旋转矩阵,需要知道表面法线,指向上的方向指向右的方向,除此之外,还需要一个锚点,这个锚点在旋转过程中固定不变.Shader "Board"{ Properties { _MainTex ("Texture", 2D) = "white" {} [Toggle]_Vertical("Vertical",Range(0,1)) = 1 } ...原创 2019-12-02 17:28:32 · 605 阅读 · 0 评论 -
Unity Shader顶点动画
Shader "vertexAni"{ Properties { _MainTex ("Texture", 2D) = "white" {} _Magnitude("Magnitude",float) = 1 //波动幅度 _Frequency("Frequency",float) = 1 //波动频率 _Speed("Speed",float) = ...原创 2019-12-02 17:06:06 · 734 阅读 · 0 评论 -
Unity Shader滚动动画
Shader "Scroll"{ Properties { _MainTex ("Texture", 2D) = "white" {} _Scrollx("Scroll Speed", Range(0,10)) = 1 } SubShader { Tags { "RenderType"="Opaque" } ...原创 2019-12-02 16:47:15 · 398 阅读 · 0 评论 -
Unity Shader 序列帧动画
原理:计算每个时刻需要播放的关键帧在纹理中的位置,当播放速度达到一定值时,看起来就是一个连续的动画Shader "anim"{ Properties { _MainTex ("Texture", 2D) = "white" {} _HorizontalAmount("Horizontal Amount",Float) = 4 //水平方向关键帧图像个数 ...原创 2019-12-02 16:30:37 · 323 阅读 · 0 评论 -
Unity Shader镜面效果
原理:使用Render Texture作为贴图,贴到镜子上Shader "Mirror"{ Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 ...原创 2019-12-02 16:11:18 · 1482 阅读 · 0 评论 -
Unity Shader菲涅耳反射
公式:实现如下:Shader "_Fresnel"{ Properties { _MainTex ("Texture", 2D) = "white" {} _FresnelScale("Fresnel Scale",Range(0,1)) = 0.5 _Cubemap("Refraction Cubemap",Cube) = "_Skybox"{}...原创 2019-12-02 15:56:36 · 129 阅读 · 0 评论 -
Unity Shader 折射
实现如下:Shader "Refract"{ Properties { _MainTex ("Texture", 2D) = "white" {} _RefractColor("Refraction Color", Color) = (1,1,1,1) _RefractAmount("Refraction Amount",Range(0,1)) = 1...原创 2019-12-02 15:43:24 · 623 阅读 · 0 评论 -
Unity Shader反射
实现如下:主要有两个变量,反射颜色和反射量,通过计算出反射方向对Cubemap进行采样,最后混合颜色Shader "Reflect"{ Properties { _Color ("Color Tint", Color) = (1, 1, 1, 1) _ReflectColor ("Reflection Color", Color) = (1, 1, 1, 1) _Reflect...原创 2019-12-02 14:16:31 · 305 阅读 · 0 评论 -
Unity Shader 雪效果
原理:采集雪贴图和雪的法线贴图,然后求得世界下的法线方向,并用主纹理的法线贴图和雪的法线贴图进行插值,插值系数是世界空间和雪方向的点积,并用一个雪量变量进行控制,得到插值后的法线,实现如下:Shader "Snow"{ Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albe...原创 2019-12-02 13:49:40 · 702 阅读 · 0 评论 -
Unity Shader区域过渡效果
代码如下:Shader "transition"{ Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Tex2("Tex2",2D) = "white"{} _Glossiness ("Smo...原创 2019-12-02 13:13:55 · 934 阅读 · 0 评论 -
Unity Shader消融效果
原理:利用clip函数,通过测试的渲染,没通过测试的就不渲染,我们需要一个消融纹理来进行采样控制消融区域。为了控制消融效果,我们需要一个消融阈值。其次在消融边缘会有一些烧毁效果,我们需要一个烧毁纹理。为了控制烧毁的效果,还需要一个烧毁强度,最后为了控制烧毁边缘的范围,我们还需要一个烧毁长度完整代码如下:Shader "Disolve"{ Properties { ...原创 2019-12-02 12:54:28 · 715 阅读 · 0 评论 -
Unity Shader模糊效果
原理:对uv采样进行偏离,然后平均化实现如下:Shader "Blur"{ Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,...原创 2019-12-02 12:14:59 · 379 阅读 · 0 评论 -
Unity Shader 阴影实现
阴影是光线被阻挡的结果,在实时渲染中,我们最常使用的是一种名为Shadow Map阴影映射的技术,效果不错,而且相对容易实现。阴影映射原理我们以光的位置为视角进行渲染,我们能看到的东西都将被点亮,看不见的一定是在阴影之中了那如何知道物体是看得见还是看不见呢?我们使用阴影映射纹理,它的本质是一张深度图,记录了从光源的位置出发、能看到的场景中距离它最近的表面位置.在计算阴影纹理映射时,如何...原创 2019-11-15 20:31:14 · 1987 阅读 · 0 评论 -
Unity Shader延迟渲染
原理之前我们在一直使用的光照方式叫做前向渲染或正向渲染。它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。它非常容易理解,也很容易实现,但是同时它对程序性能的影响也很大,因为对于每一个需要渲染的物体,程序都要对每一个光源每一个需要渲染的片段进行迭代,这是非常多的!因为大部分片段着色器的输出都会被之后的输出覆盖.延迟渲染为了解决上述问题...原创 2019-11-15 16:05:52 · 943 阅读 · 0 评论 -
Unity Shader 前向渲染
在Unity前向渲染路径中有3种处理光照的方式:逐顶点,逐像素处理,球谐函数。前向渲染前向渲染也叫正向渲染,它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。它非常容易理解,也很容易实现.当光源设置为Important时,是逐像素光源,最重要的平行光是逐像素光源,一个场景中逐像素光源的数一般可以设置。在Project Settings...原创 2019-11-14 16:28:48 · 452 阅读 · 1 评论 -
Unity Shader边缘光、X光线的实现
为了实现边缘光,我们首先要知道边缘的定义,对我们来说 如果我们观察的方向与某一点的法线垂直,就说明这个点它就是边缘,知道了原理之后实现就很简单了.首先定义相关的属性:_RimColor("RimColor", Color) =(1,1,1,1)_RimPower("RimPower", Range(0,3)) = 1然后在CG代码里面定义相关的变量:float4 _RimColor;...原创 2019-11-13 18:06:43 · 961 阅读 · 0 评论 -
Unity卡通风格的渲染之描边
过程式几何轮廓线渲染这种方法的核心是使用两个Pass渲染,第一个Pass渲染背面的面片,第二个Pass正常渲染正面的面片.在第一个Pass中,我们使用轮廓线颜色渲染整个背面的图片,并把模型顶点沿着法线方向向外扩张一段距离:v.vertex.xyz += v.normal * _Outline;首先创建着色器,添加必要的属性: _MainTex ("Texture", 2D...原创 2019-11-13 17:33:44 · 875 阅读 · 0 评论 -
Unity Shader透明度测试、透明度混合、开启深度写入的半透明效果、双面渲染的透明效果
在Unity中,我们通常使用两种方式来实现透明效果:1.使用透明度测试 2.透明度混合.透明度测试:只要一个片元的透明度不满足条件,它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何英雄,不需要关闭深度写入.透明度混合: 使用当前片元的透明度作为混合因子,与以及存储在颜色缓冲中的颜色值进行混合,得到新的颜色。需要关闭深度写入,要非常小心物体的渲染顺序.问题1...原创 2019-11-12 18:34:04 · 1773 阅读 · 1 评论 -
Unity Shader渐变纹理、不使用渐变纹理实现渐变效果、遮罩纹理
渐变纹理之前我们计算漫反射光照时,都是使用表面法线和光照方向的点击结果与材质的反射率相乘来得到表面的漫反射光照,有时,我们需要更加灵活地控制光照结果,就可以使用渐变纹理来控制漫反射光照的结果.Shader "RampTexture"{ Properties { _Color("Color Tint",Color) = (1, 1, 1, 1) _RampTex("Ramp...原创 2019-11-12 16:04:50 · 919 阅读 · 0 评论 -
Unity纹理之凹凸映射
凹凸映射有两种办法:一种办法是高度纹理来模拟表面位移,然后得到一个修改后的法线值。另一种方法是法线纹理来直接存储表面法线.法线纹理法线纹理中存储的就是表面的法线方向。法线方向的分量范围在[-1,1],而像素的分量范围在[0,1],因此需要做一个映射:rgb_normal = normal * 0.5 + 0.5;因此我们在Shader中对法线纹理进行纹理采样后,还需要对结果进行反映射的过...原创 2019-11-12 14:16:06 · 488 阅读 · 0 评论 -
Unity基础纹理
为了使用纹理,首先需要在Properties语义块中添加一个纹理属性:_MainTex("Main Tex", 2D) = "white"{}然后需要在Cg代码片中声明和上述属性相匹配的变量:sampler2D _MainTex;此外,我们还需要为纹理类型的属性声明一个float4类型的变量_MainTex_ST.这个名字不是乱取的,在Unity中,需要使用纹理名_ST的方式来声明某个...原创 2019-11-11 18:06:18 · 267 阅读 · 0 评论 -
Unity高光反射光照模型、Blinn-Phong光照模型
基本计算公式如下:fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir,viewDir)),_Gloss);需要4个参数,入射光线的颜色和强度lightColor,材质的高光反射系数Specular,视角方向viewDir和反射方向reflectDir。逐顶点光照的高光反射Shad...原创 2019-11-11 16:45:10 · 408 阅读 · 0 评论 -
Unity漫反射光照模型、逐像素漫反射光照、半兰伯特模型
标准光照模型标准光照模型分为4个部分:自发光:用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。高光反射:用来描述当光线从光源照射到模型表面,该表面会在完全镜面反射方向散射多少辐射量.漫反射:用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量.环境光:用于描述其他所有的间接光照.在Unity中实现漫反射光照模型Shader "Diffuse Vert...原创 2019-11-11 15:36:35 · 257 阅读 · 0 评论 -
Unity Shader之最简单的顶点/片元着色器
Shader "SimpleShader"{ SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag float4 vert(float4 v:POSITION):SV_POSITION { return UnityObjectToClipPos(v); ...原创 2019-11-10 18:48:07 · 404 阅读 · 0 评论 -
3D数学之镜像、切变
镜像镜像是一切变换,其作用是将物体沿直线或平面翻折。之前我们推过了缩放矩阵,镜像无非就是以缩放因子为-1进行变换。我们把-1带入,得到沿任意轴镜像的2D矩阵:同理把-1带入,得到沿任意轴镜像的3D矩阵:切变切变是坐标系"扭曲"变换,非均匀地拉伸它。切变的时候角度会发生变化,但面积和体积却保持不变。基本思想就是将某一坐标的乘积加到另一个上.切变变换矩阵:Hx的意义是:x坐标根据...原创 2019-11-10 14:33:08 · 1226 阅读 · 0 评论 -
3D数学之正交投影
向X轴投影的2D矩阵向X轴投影时,舍去y维度,通过使垂直方向上的缩放因子为零来实现。向Y轴投影的2D矩阵同理可得向XY平面投影的3D矩阵同理可得向xz平面投影的3D矩阵向yz平面投影的3D矩阵向任意直线投影的2D矩阵这里的n垂直于投影直线....原创 2019-11-07 12:20:24 · 1213 阅读 · 0 评论 -
缩放矩阵
沿坐标轴的2D缩放矩阵沿坐标轴的3D缩放矩阵按照2D矩阵同理,很容易得出3D缩放矩阵为沿任意轴的2D缩放矩阵沿任意轴的3D缩放矩阵类似的可以得到下面的矩阵:...原创 2019-11-04 16:17:46 · 1137 阅读 · 0 评论 -
三维绕任意轴旋转矩阵
绕z轴旋转由于绕z轴旋转,相当于在xy旋转,和之前二维旋转是差不多的绕X轴旋转x轴不变绕y轴旋转注意在左手坐标系中,从轴的正方向往负方向看,顺时针为正方向,逆时针为负方向。右手坐标系,旋转的正方向是逆时针的,负方向为顺时针.绕任意N轴旋转vR(n,θ) = v’由图可知 v’ =vll+ vT只要计算出vT,就可以求出v’...原创 2019-11-04 15:20:59 · 21666 阅读 · 10 评论