Unity-ShaderLab实现玻璃和镜子效果
在这一篇中会实现会介绍折射和反射,以及菲尼尔反射;并且实现镜子和玻璃效果;
高级纹理这里和之前不同的地方在于取样的是一张CubeMap;
demo里的cubemap使用的一样,相机所在位置拍出来的周围环境图;
生成CubeMap的工具脚本:
1234567891011121314151617181920212223242526272829public class RenderCubemapWizard : ScriptableWizard { public Transform renderFromPosition; public Cubemap cubemap; void OnWizardUpdate () { helpString = "Select transform to render from and cubemap to render into"; isValid = (renderFromPosition != null) && (cubemap != null); } void OnWizardC ...
Unity-ShaderLab纹理动画
顶点动画shader要关闭动态合批”DisableBatching”=”True”;
序列帧动画
纹理取样有Scale和offset,将上面的png图当做纹理,每次按间隔时间偏移取样纹理的起点;
123456789101112131415fixed4 frag (v2f i) : SV_Target{ //Time四个分量 y代表1t,floor向上取整 float time = floor(_Time.y * _Speed); float row = floor(time/_HorizontalAmount); float column = floor(time/_VerticalAmount); //播放顺序,Unity左下角原点,所以-row,这行是计算简化的结果,没有实际意义 half2 uv = i.uv + half2(column,-row); uv.x /= _HorizontalAmount; uv.y /= _VerticalAmount; fixed4 color = tex2D(_ ...
Unity-实现Vignette过场动画效果
postprocessing中有渐晕效果(Vignette),镜头可以由边缘往中间慢慢变黑;
但是我打包WebGL的时候提示我postprocessing,GPU不支持…
so,用shaderlab实现了简单的效果,如果需要边缘模糊,就根据距离做透明度插值;
效果展示
PostEffectsBase提供公共方法,所有的postprocess后期效果都继承该类;
Start方法中检查设备是否支持后期效果;
CheckShaderAndCreateMaterial方法检测是否支持shader,支持则创建并返回该shader的对应材质;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354[ExecuteInEditMode][RequireComponent (typeof(Camera))]public class PostEffectsBase : MonoBehaviour { // Called when start prote ...
Unity-Texture+PBR两种工作流程
导入TextureInpspectorTextureSize
2的n次幂,底层图形学需要,计算更快;不使用2的倍数,系统也会添加像素补全2n;
有最大尺寸限制8k,cubemap最高4k;
Mipmap
图像逐渐减小版本的列表;纹理远离摄像机时,Unity 会自动使用较小版本的纹理;LOD
内存增加33%;
WarpMode
循环模式:平铺,拉伸,镜像,一次镜像回退到拉伸,Per-Axis(uv轴不同循环模式);
FilterMode
滤波模式;采样方式:
Point:点插值,拉伸块状化(锯齿);
Bilinear:双线性插值,拉伸模糊;
Trilinear:三线性插值,除了Bilinear,在不同mipmap等级进行模糊;
AnisoLevel
各项异性过滤,掠射角观察提高纹理质量,非常消耗显卡资源,一般禁止;
导入器规范资源格式Unity导入资源有默认格式,Texture导入默认type是Deafult;如果是2D游戏要求都是Sprite;每次导入都需要修改类型非常麻烦;
Unity提供了导入资源设置资源属性的接口;
这段代码可以实现导入图片资源默认格式为Sprite;
12345 ...
Unity-渲染管线流程
Unity中的渲染管线流程下图是《Unity Shader 入门精要》一书中的渲染流程图;
ApplicationStage阶段:准备场景信息(视景体,摄像机参数)、粗粒度剔除、定义每个模型的渲染命令(材质,shader)——由开发者定义,不做讨论;
GemetryStage阶段:顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射;
RasterizerStage阶段:三角形设置遍历,片元着色器、逐片元操作;
每个阶段具体操作如下图(虚线框是可选阶段):
模型空间——矩阵变换——齐次裁剪空间——透视除法——NDC标准设备坐标——屏幕映射
齐次裁剪空间是视景体空间(台体);
CVV:标准视体-也就是NDC坐标系对应的空间;
透视除法:顶点坐标除以w分量,将当前z深度所在的截面缩放为(2,2,2)的截面坐标;所以w分量记录了z深度信息;
硬件做透视除法获得NDC归一化设备坐标——再经过屏幕映射获得屏幕坐标系下顶点坐标;
Unity使用OpenGL的NDC,z分量在[-1,1];
OpenGL和DirectX差异
NDC空间——OpenGL为[-1,1],DirectX为[0,1],深 ...
Unity-渲染管线学习记录
DirectX和OpenGL左右手坐标系不同,会有一些差距,得出的矩阵会不一样;
OpenGL的投影平面不是视景体的近截面;
顶点(vertexs)
顶点坐标,颜色,法线,纹理坐标(UV),连线索引;
图元(primitives)
几何顶点被组合为图元(点,线段或多边形),图元装配;
片元(fragments)
图元被分几步转换为片元:图元被适当的裁剪,颜色和纹理数据也相应作出必要的调整,相关的坐标被转换为窗口坐标。最后,光栅化将裁剪好的图元转换为片元;
顶点数据(Vertex)顶点坐标,颜色,法线,纹理坐标(UV),连线索引(三角形连线顺序-左右手坐标系顺序 不同);
顶点数据在流水管线中以图元处理:
点(GL_POINTS)、线(GL_LINES)、线条(GL_LINE_STRIP)、三角面(GL_TRIANGLES);
四边形顶点信息:顶点位置、颜色、UV、四个顶点顺序;
索引可以避免共享顶点间数据的多余——顶点缓存对象(Vertex Buffer Object,VBO)。
顶点着色器(Vertex Shader)矩阵变换通过矩阵变换将世界坐标系下的顶点变换到视口坐标系下显示; ...
Unity-技能系统
Demo展示
功能介绍集成了技能,冷却,buff,UI显示,倒计时,动画等;
技能类型:弹道技能,动画事件根据帧数采用延迟调用技能,自定义释放位置(偏移,发射点两种),buff类型技能(自身增益buff,敌人减益buff,比如加防御和毒);
技能伤害判定:碰撞判定,圆形判定(自定义圆心和半径),扇形(角度和半径),线性(长宽),选中目标才可释放;
技能伤害支持多段;
Buff类型:燃烧,减速,感电,眩晕,中毒,击退,击飞,拉拽;增益:回血,加防御;
工具类介绍CollectionHelper——数组工具,泛型,可以传入数组和条件委托,返回数组中符合条件的所有对象,以及排序功能;
TransformHelper——递归查找指定父节点下所有子节点,返回找到的目标;
SingletonMono——继承了MonoBehaviour的单例;
GameObjectPool——对象池;
DamagePopup——掉血数值显示;
基类Skill技能数据类,所有可以外部导入的技能数据都放在这个类中,以便于可以外部导入数据;
由于测试demo,我另外写了一个SkillTemp类,继承了Scriptal ...
Unity-WegGL打包问题
Rendering设置Gamma和Linear颜色空间,两者有色差,Gamma有个2.25左右的修正值;
WebGL2.0可用的情况,只支持Deferred Render延迟渲染,且只支持Linear颜色空间;
UnityWebGL使用Video播放工具还不支持WegGL2.0;
使用WebGL1.0对shader有很大的限制,如果shader失效替换WebGL2.0,或者调低shader版本;
这里的设置还关系到屏幕后期处理PostProcessing能不能用;
OtherSettingStrip Engine Code和Managed Stripping Level大概是什么代码剥离和剥离等级,打包后运行出错有可能就是这里选择了enable;
Prebake Collision Mesh:提前添加碰撞到网格,变复杂场景加载过慢问题,空间换时间;问题;
Optimize Mesh Data:静态分析材质,去掉Mesh中无用的数据,比如切线,多余UV什么的;但是如果有代码动态切换材质使用法线的,打包运行会出错,尽量也别选吧;
PublishingSettingsEnable Excep ...
Unity-打包安卓项目问题汇总
V1,v2签名问题安卓11以上——v1签名无法使用;
安卓7以下——v2无法使用;
应用宝不支持没有v1签名的包;
AndroidStudio版本2020打签名包时无法勾选v1,v2选项,4.2版本可以;
打完包后验证只有v2,没有v1——miniSdK要求不能高于24;
v1,v2签名验证工具
解压后将打包好的releaseAPK放在.bat同级目录,apk文件名称必须为:launcher-release.apk;
双击运行main.bat;
拉起微信小程序1234567String appId = ""; // 填应用App IWXAPI api = WXAPIFactory.createWXAPI(this, appId);WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();req.userName = ""; // 填小程序原始idreq.path ="";//拉起小程序页面的可带参路径,不填默认拉起小程序首页req.miniprogramType ...
Unity-日志打印工具
日志工具功能封装Debug类,需要实现功能:
1.控制所有日志是否打印;
2.除了Log,Warning,Error外,给更多日志种类(不同颜色);
3.格式化打印日志;
4.不定参数,自动拼接成字符串;
5.上传日志到服务器;
Logger类控制日志打印封装Debug中关于Log的方法;
使用静态方法,声明静态字段,控制log,warning,error是否打印;
Debug源码中Log方法有两个重载;
第二个参数context可以传参GameObject,Hierarchy或者Project窗口中的预制体,双击Console日志会直接跳转选中传入的游戏物体;
我们可以将这个方法合并,第二个参数默认空;
色彩打印打印不同颜色使用富文本;
1string.Format("<color={0}>{1}</color>",color,obj);
多参数拼接之前使用Go语言的fmt.Println有个功能很好用,连续传多个参数自动拼接;
123456789101112131415public stat ...