Unity光源类型
光源
平行光
点光源
聚光灯d
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155// Upgrade NOTE: replaced '_LightMatrix0' with 'unity_WorldToLight'// Upgrade NOTE: replaced '_Object ...
Unity渲染路径
什么是渲染路径(rendering path)
渲染路径决定了光照是如何应用到unityshader中。
一般一个项目只使用一种渲染路径:
open Editor
关闭use defaults即可设置
设置多个渲染路径
可以在不同相机中设置不同的渲染路径
如果显卡不支持,unity会自动降一级渲染路径
标签名
描述
Always
不管使用哪种路径,该pass总是会被渲染,但不会计算光照
ForwardBase
用于向前渲染,会计算环境光,最重要的平行光,逐顶点/SH光源和Lightmaps
ForwardAdd
向前渲染,会计算额外的逐像素光源,每个pass对应一个光源
Deferred
延迟渲染,渲染G-buffer
ShadowCaster
把物体的深度信息渲染到阴影纹理映射(shadowmap)或一张深度纹理中
PrepassBase
遗留的延迟渲染,会渲染法线和高光反射的指数部分
PrepassFinal
遗留的延迟渲染,通过合并纹理,光照,自发光来渲染最后得到的颜色
Vertex,VertexLMRGBM,Ver ...
Unity光照衰减
使用纹理作为插值表优点:采样即可,可以提升性能,适用于大部分场景。
缺点:
需要预处理得到采样纹理,纹理大小会影响衰减的精度
不直观和不方便,无法使用其他数学公式来计算衰减。
操作只关心对角线上的衰减值。
先获得光源空间的位置,使用光源空间中顶点距离的平方采样,避开开方操作(理解:范围在0-1,平方的范围也在0-1),使用.rr操作就是构建一二维数组,再使用UNITY_ATTEN_CHANNEL获得衰减纹理的分量值。
Unity阴影
阴影实现
实时渲染中使用的Shadow Map:把摄像机与光源重合,阴影区域就是摄像机看不到的地方。
unity使用额外的Pass专门更新光源的阴影映射纹理,这个pass就是LightMode被设置未ShadowCaster的pass。该pass的渲染目标是阴影映射纹理。通过调用该pass先将摄像机摆放到光源位置,再将深度信息存入阴影映射纹理中。
该Pass会被优先执行
屏幕空间的阴影映射技术
调用LightMode为shadowcaster的pass得到阴影纹理映射和摄像机的深度纹理,根据这两张图来得到屏幕空间的阴影图(在摄像机的深度中但不在光源的深度中:可见的阴影)
接受阴影:采样结果和光照结果相乘
投射阴影:把该物体加入阴影映射纹理的计算中。
123456789101112131415161718192021222324252627282930313233Pass { Name "ShadowCaster" Tags { "LightMode" = "ShadowCaste ...
Debug
使用假彩色图像主要思想:把需要调试的变量映射到0-1,作为颜色输出到屏幕
1
使用VSGraphics Debugger
帧调试器(Frame Debugger)window-frame debugger
Unity内置文件和变量
内置文件
后缀为.cginc
路径:安装位置/Data/CGIncludes
文件名
描述
UnityCG.cginc
包含最常使用的帮助函数、宏和结构体
UnityShaderVariables.cginc
编译时会自动包含,包括许多内置的全局变量,比如UNITY_MATRIX_MVP
Lighting.cginc
包含内置光照模型,编写surface shader会自动包含
HLSLSupport.cginc
编译时会自动包含,生命很多跨平台的宏和定义
UnityCG.cginc常用结构体
名称
描述
包含的变量
appdata_base
顶点着色器输入
顶点位置,法线,第一组纹理坐标
appdata_tan
顶点着色器输入
顶点位置,法线,切线,第一组纹理坐标
appdata_full
顶点着色器输入
顶点位置,法线,切线,四组纹理坐标
appdata_img
顶点着色器输入
顶点位置,第一组纹理坐标
v2f_img
顶点着色器输出
裁剪空间位置,texcoord0纹理坐标
UnityCG.c ...
shader编写规范
float half fixed
类型
精度
float
最高精度浮点值,32位
half
中等精度,16位,-60000~+60000
fixed
最低精度,11位,-2.0~+2.0
不同的值请选择不同的精度类型,减少内存的消耗
避免不必要的计算
不同的Shader Target,不同的着色器阶段,可以使用的临时寄存器和指令数目是不同的。
指令
描述
#pragma target 2.0(Direct3D Shader Model 2.0)
默认等级,不支持顶点纹理采样,不支持显示的LOD纹理采样
#pragma target 3.0(Direct3D Shader Model 3.0)
支持顶点纹理采样
#pragma target 4.0(Direct3D Shader Model 4.0)
支持几何着色器
#pragma target 5.0(Direct3D Shader Model 5 .0)
慎用分支和循环语句
不鼓励在shader中使用流程控制语句,会降低GPU并行处理操作
如果大量使用,要把该使用 ...
UnityShader结构
第一个代码学习1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'//开头引号内存放路径Shader "MyShader/BaseShader"{ //属性栏 Properties{ //声明一个Color类型属性 _Color("Color Tint",Color)=(1.0,1.0,1.0,1.0) } SubShader{ Pass{ CGPROGRAM //告诉unity定义了vert和frag:顶点和片元着色器 ...
语义
什么是语义
语义是赋给shader输入和输出的字符串,即语义可以让shader知道从哪读取数据,并把数据输入到哪。
语义出现的位置 不同,含义也不同。
系统数值语义
以SV开头
不可以被随便赋值:需要完成特定的目的
Unity支持的语义a2v
语义
描述
POSITION
模型空间的顶点位置,通常是float4类型
NORMAL
顶点法线,float3
TANGENT
顶点切线,float4
TEXCOORDn
该顶点的纹理坐标,通常是float2或者float4
COLOR
顶点颜色,fixed4或者float4
v2f
语义
描述
SV_POSITION
裁剪空间的顶点坐标,必须被包含
COLOR0
输出第一组顶点颜色(不是必须)
COLOR1
输出第二组顶点颜色(不是必须)
TEXCOOORD0-7
输出纹理坐标,不是必须
OUT
语义
描述
SV_Target
会将输出值存储到渲染目标中。
双面渲染的透明效果
使用Cull命令
Cull Back|Front|Off,不渲染背面|前面|关闭
透明度测试的双面渲染12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unity Shaders Book/Chapter 8/Alpha Test With Both Side" { Properties { _Color (& ...