调整屏幕亮度 饱和度 对比度
为摄像机添加脚本12345678910111213141516171819202122232425262728293031323334353637using UnityEngine;using System.Collections;//该脚本继承自PostEffectsBasepublic class BrightnessSaturationAndContrast : PostEffectsBase { public Shader briSatConShader; private Material briSatConMaterial; //使用该shader并且返回一个使用该shader的材质 public Material material { get { briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader, briSatConMaterial); return briSatConMaterial; } } //定义三个参数用 ...
边缘检测
图像处理中的卷积其实就是用卷积核对一张图像的像素进行处理,不同卷积核所处理的最终效果不同。
其实也叫算子。这部分内容请自学相关内容。
使用sobal算子计算边缘sobal算子一般是两个3x3的算子,一个用来计算上下之间的像素差,一个计算左右的像素差,像素差越大,该像素就越白或越黑。两个得到的梯度值通过平方和开根号得到最终的梯度值。
脚本编写其实不难看出,脚本的作用主要就是调用OnRenderImage和传入控制的参数,真正的处理需要放到shader当中。
1234567891011121314151617181920212223242526272829303132333435//EdgeDetection.csusing UnityEngine;using System.Collections;public class EdgeDetection : PostEffectsBase { public Shader edgeDetectShader; private Material edgeDetectMaterial = null; public Material mate ...
运动模糊
什么是运动模糊在摄像机曝光的时候,拍摄场景发生变换,就会产生模糊的画面。运动模糊可以让物体运动看起来更加真实平滑。
实现方法1:利用一块累计缓存accumulation buffer,用来混合多张连续的图像,当物体快速移动,我们取多张图像的平均值作为最后的图像。
缺点:性能消耗大,需要在同一帧渲染多次场景。
实现方法2:使用速度缓存velocity buffer,这个缓存存储像素当前的运动速度,利用该值决定模糊的方向。
方法1实现不需要渲染多次场景,只需要保存之前的渲染结果,不断把当前的渲染图像叠加之前的渲染图像,产生一种运动轨迹的视角效果。可以提高性能,但是模糊效果肯定不如之前的效果。
脚本12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152using UnityEngine;using System.Collections;public class MotionBlur : PostEffectsBase { public Shader ...
高斯模糊
原理利用另一个算子,均值滤波器,这个算子的作用可以平均邻域内的像素,从而达到模糊的效果
高斯滤波:很好的模拟了邻域每个像素对当前像素的影响程度:距离越近,影响越大。高斯核的维数越高,模糊程度越大。
实现把5x5的高斯核变成横向和纵向的两个一位高斯核,用两个pass来得到最后的图像,通过图像缩放提高性能,通过应用次数来控制模糊程度
脚本类:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105using UnityEngine;using System.Collections;public class GaussianBlur : PostEffectsBase { public Shader gaussianBlurSh ...
渲染纹理
什么是渲染纹理GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理,多重渲染目标可以把场景渲染到多个渲染目标纹理当中,而不需要为每个目标单独渲染一次整个场景。
unity为渲染目标纹理定义了一种专门的纹理类型:渲染纹理
使用方法:
在project目录下创建渲染纹理,把某个摄像机的渲染纹理目标设置为该渲染纹理。
该相机的渲染结果会实时更新到渲染纹理当中
使用屏幕后处理的方式使用GrabPass和OnRenderImage函数来获得当前屏幕图像。然后就可以进行图像处理。
实现镜子效果
将希望镜子呈现的图像通过摄像机显示,即在背面设置一个相机,将渲染纹理通过面片显示出来。
将渲染纹理赋给shader的texture即可
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849//代码如下// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityO ...
立方体纹理
什么是立方体纹理
立方体纹理是环境映射的一种实现方式。
一共包含6张图像
好处:实现简单快速,效果好。
缺点:场景中引入新的物体,光源,或者物体发生移动时需要重新生成。
不能模拟多次反射的结果
尽量对凸面体使用立方体纹理。
天空盒子用于模拟背景的一种方式。
添加天空盒子:
新建材质,shader选择自带的Skybox/6 sided.
将图片附上,图片的wrap mode设置为clamp,
在window-rendering-lighting中的scene中将skybox设置为之前的材质
该设置会覆盖所有摄像机,如果希望使用不同的,需要给摄像机添加skybox组件。
创建环境映射的立方体纹理
特殊布局的纹理创建
需要类似立方体展开图或者全景布局图,将texture type设置为cubemap
手动创建Cubemap
上面的方法
脚本生成
通过unity提供的Camera.RenderToCubemap函数实现,该函数可以把任意位置的场景图像储存到6张图像中。
1234567891011121314151617181920212223242526272829 ...
程序纹理
什么是程序纹理通过算法创建个性图案或者非常真实的自然元素
实现程序材质通过脚本创建程序纹理
通过Substance Designer创建程序纹理和材质
3.1 UnityShader概述
ShaderLab*
5.6 小心平台差异
渲染纹理的坐标差异前提:我们需要使用渲染纹理(render texture)保存渲染结果时,就要注意openGL和DirectX的差异
结果:unity会在背后帮助处理,以达到不同平台的一致性
特殊情况:开启抗锯齿后(edit-project settings-quality-anti alising),碰到具体问题时再详细了解(p115-p116)
shader 的语法差异shader的语义差异
2.1.2 什么是渲染流水线
渲染流水线工作任务:将三维场景渲染(生成)为一张二维图像。
渲染流程:
应用阶段(Application):开发者决定
准备场景数据(模型,相机,光源等)
culling,剔除不可见物体
设置渲染状态(材质,纹理,shader)
输出渲染图元(几何信息)
几何阶段(Geometry):GPU上
绘制什么
如何绘制
在哪绘制
把顶点坐标变换到屏幕空间,输出屏幕空间的二维顶点坐标,深度值,着色等信息。
光栅化阶段(Rasterizer):GPU
根据数据渲染最终图像
像素化(个人理解)