unity基本光照模型实现
unity红点框架代码
最近公司项目做到了红点的步骤,之前的项目感觉红点架构感觉不太好用,于是我自己设计了一下。来上代码
先上C# 代码
预制体红点绑定这个 可以绑定lua文件 在lua检测红点条件
1 | /** |
红点管理器可以导出lua之后调用更新
1 | /** |
枚举值可在预制体选择那个类型
1 | /** |
lua方面的代码介绍
1 | MainRedDotHelp = newClass("MainRedDotHelp",LuaBehaviour); |
好啦大概就这样了 用起来还行
Unity烘焙
1 什么是烘焙,有什么用
析度/具体数据加工为低维/低解析度/特化数据的过程,通常是为了生成近似算法所需的数据,以提高运行时效率。
2 光照贴图烘焙
你把物体模型放进了场景里之后, 引擎会计算光线,光线照到你的物体的表面形成反光和阴影。 如果不烘焙, 游戏运行的时候,这些反光和阴影都是由显卡和CPU计算出来的。
你烘焙之后,这些反光和阴影都记录到了你的模型里,变成了新的贴图了,运行的时候,显卡和CPU不需要进行对环境光效果的运算了。如前面的回答,节约CPU资源。
3 Lighting Mode(光照模式)
3.1 指定 Unity 对场景中的所有混合光照使用哪种光照模式
3.2 Baked Indirect(烘焙间接)
如果场景中的灯光模式设置为Mixed,那么这些灯光会给场景提供直接光照,间接光照信息则被烘焙到光照贴图和光照探针中。
3.3 Shadowmask(遮罩)
如果场景中的灯光模式设置为Mixed,灯光会给场景提供直接光照,间接光照烘焙到光照贴图和光照探针中。Shadowmask和光照探针遮挡信息会被烘焙到阴影信息中。
3.4 Subtractive(减法)
场景中的直接光照,间接光照和阴影信息都会烘焙到光照贴图中。适合对性能敏感的平台比如移动端平台。
3.5 支持的渲染管线:
1. 内置渲染管线(Built-in Render Pipeline):支持Baked Indirect,Subtractive和Shadowmask光照模式。
2. 通用渲染管线(Universal Render Pipeline,简称URP):支持Baked Indirect,Subtractive和Shadowmask光照模式。
3. 高清渲染管线(High Definition Render Pipeline,简称HDRP):支持Baked Indirect和Shadowmask光照模式。
4 Lightmapper(光照贴图系统)
使用该选项来指定使用哪种光照计算方式来计算场景中的光照贴图。选项有:Progressive 和 Enlighten(遗弃)。默认选项是 Progressive。新增了 CUP 和GPU类型 ,影响烘焙效率
5 Prioritize View(优先视图)
启用此选项,如果Scene窗口打开,系统会逐步烘焙Scene窗口看到的画面,然后再继续烘焙Scene画面之外的场景区域。
如果你在Scene窗口移动场景中物体,改变物体和灯光属性或者改变Scene窗口画面等操作,烘焙会及时调整,快速逐步烘焙改变后的画面。在使用此选项时记得打开Auto Generate(自动生成)复选框。
6 Multiple ImportanceSampling(多重重要抽样)
(默认是禁用状态)这是针对环境光采样的设置。如果开启,可以缩短光照贴图的生成时间,但是在场景中某些较暗的地方会产生明显的噪点。
7 Direct Samples(直接光照采样)
用于设置从每一个纹素(Texel)射出的采样路径数(针对直接光照)。数值越大效果越好,烘焙时间也越长。
8 Indirect Samples(间接光照采样)
用于设置从每一个纹素(Texel)射出的采样路径数(针对间接光照)。数值越大效果越好,烘焙时间也越长。针对户外场景,指导数值为100。室内场景(包含自发光物体),可以按需增加采样路径数直到看到效果。
9 Environment Samples(环境光照采样)
针对环境光的采样数。数值越大效果越好,烘焙时间也越长。默认数值为500。
10 Light Probe SampleMultiplier(光照探头计算)
如要使用此功能,必须在Project Settings > Editor> Graphics中禁用Use legacy Light Probe sample counts
此数值会被用于分别乘以Direct Samples,Indirect Samples和Environment Samples这三个数值。这三个数值会被应用于LightProbes采样。数值越大效果越好,烘焙时间也越长。
11 Bounces(反射次数)
当追踪路径时,使用该值来指定间接光照反射的次数。对于大多数场景,反射2次应该足够了。而对于一些室内场景,可能需要更多地反射次数。
12 Filtering(过滤)
12.1
Filtering区域的设置用于光照贴图的降噪操作。降噪操作本质上是一个针对已经烘焙好的光照贴图做后处理的过程。
如果启用Filtering功能,系统会在把光照贴图的Direct,Indirect和AmbientOcclusion这三部分信息结合之前,分别为这三个部分应用降噪算法。
12.2
自动:Progressive Lightmapper会自动选择一个当前机器支持的降噪算法应用到光照贴图上(因为规则是固定的,所以具体规则请参考Unity文档)。
高级:可以为Direct,Indirect和Ambient Occlusion分别选择降噪算法(Denoiser)或者降噪滤镜(Filter)。如果你有支持Nvidia Optix降噪算法的GPU,可以选择Optix;如果有支持RadeonPro降噪算法的GPU,可以选择RadeonPro;在任何情况下,都可以选择基于CPU的降噪算法OpenImageDenoise。这里的Guassian(高斯)滤镜会在降噪算法之后在光照贴图上做进一步的模糊处理,以减少光照贴图中的噪点。
13 Lightmap Resolution(光照贴图分辨率)
数值单位为texelsper unit(每单位面积的纹素)。
Texel(纹素)有别于Pixel(像素)。像素是图片的基本单位,如果我们在图片编辑软件中把图片放大到足够大,可以看到这些图片由许多正方形的像素组成,所以像素是屏幕空间的概念。纹素则是纹理贴图的基本单位,纹理贴图是应用于模型上的,所以并不是屏幕空间的概念。
在模型被绘制到屏幕上时,纹素会被转换成屏幕上的像素展现出来。我们可以通过网络上找到的这张图来理解像素和纹素之间的对应关系
像素和纹素最大的区别是:像素其实就是图片数据;但是纹素可以代表很多类型的数据,它可以是纹理贴图,也可以是用于计算阴影的深度图。
光照贴图本质上是纹理贴图,因此Progressive Lightmapper在这里用纹素而不是像素来代表光照贴图的分辨率。
14 Lightmap Padding(光照贴图填充)
数值单位为texel(纹素),默认值为2。烘焙好的光照贴图中包含很多Charts。这些Charts可以理解成对应模型上包含烘焙光照信息的UV色块。在游戏运行时,这些色块会与模型网格进行映射,完成最终效果的计算(在模型原先的纹理上叠加烘焙的光照信息)。但是这些“色块”之间必须保持一定的距离才能确保模型上一个部位的颜色不会“渗色”到另一个部位。
15 Lightmap Size(光照贴图尺寸)
数值单位为像素,默认值为1024。根据Lightmap Resolution和Lightmap Padding的参数设定,烘焙出来的光照贴图数量会相应的变化。这里的大小其实代表的是每张光照贴图的最大尺寸。按照实际需求,即使设置了2048,某些光照贴图的尺寸也有可能是1024或者512。
16 Compress Lightmaps(压缩光照贴图)
默认启用,对光照贴图进行压缩操作。虽然压缩过的光照贴图可以减少内存占用,但是也会导致光照贴图质量下降。
17 Ambient Occlusion(环境遮蔽)
环境光遮蔽用于为场景中的某些区域比如裂缝,孔洞,墙面的交界处,或者任何两个物体相邻的区域添加类似于阴影的效果。它会让这些地方变得比其他地方更暗一些。此处的设置会把这些环境光遮蔽信息烘焙入光照贴图中。
18 Directional Mode(方向模式)
Directional:此模式下会生成第二套光照贴图,专门用于保存入射光的主要方向信息。使用法线贴图的材质可以利用这张光照贴图上的方向信息,在计算法线贴图时加入光照贴图中保存的全局光照信息。不过此模式下生成的光照贴图通常比Non-Directional模式下生成的光照贴图大一倍。(此模式下生成的光照贴图无法在SM2.0和GLES2.0硬件上解码使用。在这些硬件上会回退到Non-Directional模式)。
Non-Directional:禁止烘焙时生成第二套用于保存入射光主要方向信息的光照贴图。
19 Indirect Intensity(间接光强度)和Albedo Boost(反照率增强)
Indirect Intensity(间接光强度):用于控制光照贴图中保存的间接光强度。数值限定在0到5之间。默认数值为1。数值大于1会增强间接光强度,小于1会减弱间接光强度。
Albedo Boost(反射率增强):用于控制物体表面之间光子弹射的数量。默认数值为1。数值限定在1到10之间。数值越大,物体表面的反射率越趋向于白色。
unity新手指引和ngui点击问题
最近项目需要写新手指引,不行随便写个耦合很高的。
但是我们用的ngui 没有点击穿透这一说,这就很尴尬了。但是作为一个面向搜索引擎的程序员这有啥怕;
网上我看到了一个方案 把屏幕用4个矩形分开只剩下中间的能点击的部分没有矩形 其他地方加上box。 但是我觉很不友好,突然面向搜索引擎 又发力了
第二个方案用的meshCollider(网格碰撞器) 顺便还有大神写了个轮子 下面我们展示代码
UIMaskWidget.cs 有兴趣的自己看下
1 | using UnityEngine; |
继续显示我们的自己的逻辑
由于我想写个基本由策划自己配置就行的指引不需要程序自己操心的!!! 哈哈哈
就想到了给按钮BOX加委托 下面是我们自己的逻辑
GuideData.lua
1 | -- 新手指引 |
表现层
GuideModuleUI.lua
1 | module ('m__' .. ..., package.seeall) |
看我们的配置表
大功告成
。。。
。。
。
UnityIOS打包
UnityIOS打包流程图 下载查看全图
PBR 实战特效案例
PBR 实战特效案例
PBR Graph的简单使用
PBR Graph的简单使用
ShaderGraph科普
ShaderGraph科普
网管
一个网管眼中的一个毅丝
U3D 基于NGUI写的 listView特效裁剪
Unity NGUI UIPanel下对粒子或自定义Mesh的剪裁