透明基础
unity实现透明
透明度测试
只要一个片元的透明度不满足,就被舍弃
不需要关闭深度写入
透明度混合
可以获得真正的半透明效果
需要关闭深度写入
深度缓冲是只读
关闭深度写入后,渲染顺序很重要
先渲染所有不透明物体,并开启深度测试和深度写入
把半透明物体按距离摄像机远近排序,按照从后向前的顺序渲染,开启深度测试的同时关闭深度写入。
unityshader渲染顺序
渲染队列(render queue),使用SubShader的Queue标签觉得模型归于哪个渲染队列。
unity使用整数索引来表示渲染队列,索引越小越早渲染
unity提前定义的5个渲染队列
名称
索引号
描述
Background
1000
会在任何其他队列前被渲染,一般用来绘制背景上的物体
Geometry
2000
默认渲染队列。不透明物体使用该队列
AlphaTest
2450
透明度测试的队列,所有不透明物体渲染后再渲染该队列更加高效
Transparent
3000
在G和A队列渲染后,按从后往前的顺序渲染,使用了透明度混合的物体的队列
Overlay
4000
用于 ...
透明度测试
透明度测试123//使用该函数可以进行透明度测试void clip(x)x<0则被丢弃
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unity Shaders Book/Chapter 8/Alpha Test" { Properties { _Color ("Color ...
透明度混合
使用Blend
语义
描述
Blend Off
关闭混合
Blend SrcFactor DstFactor
开启混合,并设置混合因子。片元颜色乘以SrcFactor,缓存颜色乘以DstFactor,两者相加再存入颜色缓存中。
Blend SrcFactor DstFactor,SrcFactorA DstFactorA
使用不同因子混合透明通道
BlendOp BlendOperation
片元颜色和缓存颜色相加后使用BlendOperation进行其他操作
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'// Upgrade NOTE: re ...
光照知识
基础知识请优先学习计算机图形学,推荐老师:闫令琪
图像包含
光源
物体反射
光源
使用辐照度量化光
吸收和散射
散射:只改变光线方向,不改变光的密度和颜色
折射refraction或透射transmission:进入物体内部
反射reflection:散射到物体外部
吸收:只改变光的密度和颜色,不改变方向
从物体表面重新发射出的光线将具有和入射光线不同的方向分布和颜色
高光反射,漫反射,出射度exitance
着色指根据材质属性,光源信息用一个等式去计算某一个观察方向的出射度的过程。
等式:光照模型,不同的lighting model 可以描述不同的表面
BRDF用来解释当光线从某个方向照射到一个表面时,有多少光线被反射,反射的方向有哪些。
即给定入射光线的方向和辐照度,brdf可以给出某个出射方向上的光照能量分布。
unity实现基础光照
环境光和自发光
实现漫反射光照顶点着色器中计算1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'Shader "MyShader/Chapter 6/diffuse"{ Properties{ _Diffuese("Diffuse",Color)=(1,1,1,1) } SubShader{ Pass{ //指定光照模式为向前渲染,定义正确的mode,才能得到内置光照变量 Tags{"LightMode"="ForwardBase"} CGPROGRAM #pragma vertex vert #pr ...
顶点动画
使用内置时间变量
名称
类型
描述
_Time
float4
自场景加载的时间(t/20,t,2t,3t)
_SinTime
float4
t是时间的正弦值,(t/8,t/4,t/2,t)
_CosTime
float4
t是时间的余弦值,(t/8,t/4,t/2,t)
unity_DeltaTime
float4
dt是时间增量(dt,1/dt,smoothDt,1/smoothDt)
纹理动画帧序列动画主要思路:
动画的每一帧都放在一张图中,需要对纹理图的采样区域不停变化。
需要通过时间变量进行变化
需要把采样的区域量化
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475// Upgrade NOTE: replaced 'm ...
标准光照模型
自发光,高光反射,漫反射,环境光环境光
使用环境光来近似模拟间接光照
$c_{ambined}=g_{ambient}$
自发光
直接由光源发射入摄像机,直接使用材质的自发光颜色
$c_{emissive}=m_{emissive}$
在实时渲染中,自发光的表面不会照亮周围(不会被当做光源)
漫反射
视角的位置不重要,在任何反射方向的分布都是一样的
入射光的角度很重要
符合兰伯特定律:反射光线的强度与表面法线和光源方向的夹角的余弦值成正比。
$c_{diffise}=(c_{light}*m_{diffuse})·max(0,\hat{n}·\hat{l})$
n:法线,l:指向光源方向,c:光源颜色,m:物体漫反射颜色,max截取到0,防止被背面的光照亮。
高光反射Phong模型
用来计算完全镜面反射方向被反射的光线
$c_{specular}=(c_{light}·m_{specular})·max(0,\hat{v}·\hat{r})^{m_{gloss}}$
mgloss是材质的光泽度,也叫反光度,用来控制高光区域的大小,值越大 ...
bloom
什么是bloom效果bloom:这种特效可以模拟真实摄像机的一种图像效果,可以让画面较亮的区域扩散到周围的区域,造成朦胧的效果
实现原理:根据阈值提取图像中的较亮区域,存储在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行模糊处理,模拟光线扩散的效果,最后和原图叠加。
脚本12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970using UnityEngine;using System.Collections;public class Bloom : PostEffectsBase { public Shader bloomShader; private Material bloomMaterial = null; public Material material { get { bloomMaterial = CheckShaderAndC ...
顶点动画
流动的河流思路:使用顶点动画
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unity Shaders Book/Chapter 11/Water" { Properties { _MainTex ("Main Tex", 2D) = "white" {} _Color ("Color Tint", Color) = (1, 1, 1, 1) _Magnitude ("Distortion Magnitu ...
屏幕后处理脚本
什么是屏幕后处理屏幕后处理:指渲染整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。
unity提供抓取屏幕的接口OnRenderImage
Unity - Scripting API: MonoBehaviour.OnRenderImage(RenderTexture,RenderTexture) (unity3d.com)
利用Graphics.Blit函数完成对渲染纹理的处理
Unity - Scripting API: Graphics.Blit (unity3d.com)
屏幕后处理的基类作用:检查条件是否满足屏幕后处理,比如当前平台是否支持等
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960//PostEffectsBase.csusing UnityEngine;using System.Collections;//编辑器状态下可以执行该脚本[ExecuteInEditMode][ ...