- 博客(304)
- 资源 (1)
- 收藏
- 关注

原创 Skinned Mesh原理解析和一个最简单的实现示例
Skinned Mesh原理解析和一个最简单的实现示例 作者:n5 本文的github地址:https://github.com/happyfire/SkinnedMeshDemo
2008-10-19 23:24:00
40061
26
原创 Unity UI Default Shader分析
Unity ShaderLab的Properties一般用于将材质使用到的Shader参数暴露在材质的Inspector面板中以方便设置,并且编辑后的参数值可以和材质一起保存。另外材质使用到的渲染状态值,以及关键字也可以使用Properties进行编辑。Properties在上面的shader中,包含以上的属性。其中_MainTex, _Color是shader的参数,而_Stencil开头的这些和_ColorMask是渲染状态值,_UseUIAlphaClip则是关键字开关。
2025-02-06 23:05:11
295
原创 Unity shader中真的可以动态关闭Stencil Test吗?
由此可知,如果我上面的测试是正确的,UGUI的 UI/Default shader由于包含了Stencil,那么Stencil Test对于所有的UGUI Drawcall都是开启的。那么使用Mask似乎也不会额外影响性能了是吧,那还优化个啥呢。另外,如果Shader中根本不包含Stencil这段,则Stencil Eanble为false。但是我没有测试移动平台和DX12,但这应该是RHI无关的逻辑吧。可是Stencil这段没法动态关闭。
2025-01-12 20:02:59
374
3
原创 Unity协程机制详解
协程是一种能在一定条件下暂停执行,并在稍后恢复执行的函数。它允许将一个任务拆分为多个小任务,每一小段任务可以在多个帧内完成,而不是在一帧内阻塞主线程。在Unity中,协程通过StartCoroutine方法启动,并可以通过yield关键字来暂停执行,直到满足特定条件(例如等待时间、等待帧、等待另一个协程完成等)后继续运行。C#中的迭代器和yield return协程的本质是C#的迭代器(Iterator),而yield return就是一种控制流的中断标志。
2024-12-11 15:56:42
1550
原创 深入URP之Shader篇16: UNITY_BRANCH和UNITY_FLATTEN
实际上,编译器会进行优化,以及处理成多种不同的情况。比如编译器会将if和else展开,分别执行其中的代码,然后根据测试条件选择一个结果,这被称为Flatten。或者编译器会真的编译出if指令,真正的动态分支。这取决于平台是否支持。比如在老的OpenGL ES 2.0平台,编译器总是进行Flatten,所以if分支才被视作性能杀手。当然即便是没有Flatten,真正的动态分支由于会让同一个Warp中的线程不能同步执行而互相等待,也会造成性能问题。在DX11中,编译器支持[branch]和[flatten]
2024-05-31 17:24:03
1697
原创 深入URP之Shader篇15: Shader关键字和变体
每种关键字的组合对应的shader版本就是一个shader变体。所谓变体,就是同一份shader源码,由于启用了不同的关键字组合,经过编译器预处理就得到了最终不一样的shader代码。
2024-02-22 10:45:30
1535
原创 CORS的原理以及在Node.js中的使用
前端浏览器中的JavaScript代码使用XMLHttpRequest对象或Fetch API等方法发起HTTP请求到不同域的服务器。当浏览器中的JavaScript代码发起跨域请求时,浏览器会执行CORS检查。它会检查请求的目标域(服务器的域)是否在服务器的响应头中包含了合适的标头。如果服务器允许该请求的来源,浏览器会继续发送请求。当服务器接收到请求并准备发送响应时,在响应头中设置标头,指定允许访问的域。这个标头可以是具体的域名,也可以是通配符(),表示允许任何域进行访问。
2023-10-31 19:05:56
566
原创 WSL启动时自动启动docker服务
在Windows Subsystem for Linux 2 (WSL 2)中,可以通过修改WSL 2的启动配置,使得WSL启动时自动启动Docker服务。Windows系统的WSL,当windows关机再开机后,WSL等于是重新开机的,默认情况下,不会启动Docker服务。这段代码会在每次启动WSL 2时检查Docker服务是否已经运行,如果没有运行,则会自动启动Docker。关闭当前的WSL终端窗口,然后重新打开一个新的WSL终端窗口。请确保你拥有足够的权限来修改WSL的配置和启动Docker服务。
2023-10-31 17:05:11
2231
1
原创 使用密钥访问远程主机
从某些云服务商处购买的主机,一般会给你root密码访问,如果在自己的电脑上经常要登录,每次都输入密码不是很方便。其实可以使用密钥访问。
2023-10-31 16:58:34
499
原创 深入URP之Shader篇14: GPU Instancing
首先,定义PerMaterial Uniform block时,要使用INSTANCING相关的宏和。这些宏的作用是将Uniform block定义成数组。需要注意的是,只有当同一个材质下面的不同Instance存在逐Instance不同的属性时,才需要将UnityPerMaterial的CBuffer改成使用这些宏,否则是不需要的,因为这些宏只是为了将属性定义成数组,然后可以使用Instance索引去得到数组里面不同Instance各自的属性。
2023-08-27 17:58:14
1324
原创 aws EC2实例私钥丢失解决方法
网上搜有很多种方法,我自己试了一个好使的记录一下,这个方法比较简单。原理就是使用clound init脚本创建一个具有管理员权限的新用户,并设置新的公钥。这样就可以使用这个新用户的私钥登录实例了。
2023-05-31 19:49:05
664
原创 深入URP之Shader篇13: SRP Batcher
首先对于Unity内置属性,比如要放在一个名字为的CBuffer中。其实我们写自定义shader都是直接include URP的Libraray的,其中已经做好了这个。在Packages\com.unity.render-pipelines.universal\ShaderLibrary\UnityInput.hlsl中我们看到:这些属性被分为不同的block,虽然我们可能只使用一部分block,但是还是得按照这个布局来。材质自定义的属性要放在的CBuffer中。
2023-04-04 12:05:29
2035
原创 深入URP之Shader篇12: 深度值专题(3)
深度图的定义在本篇中分析了深度图的生成,定义和采样,结合软粒子效果看了一下深度图和线性深度的应用。
2023-02-13 17:15:46
1901
原创 GAMES202 PCSS软阴影算法细节解析
在LearnOpenGL框架的基础上实现了一遍GAMES202的PCF+PCSS软阴影,之前学习GAMES202时一些没弄清楚的问题顺便搞清楚了。注:本文中代码和shader均在笔者中实现,因此有一些细节可能和GAMES202作业框架不一致,且对202框架中的一些错误进行了修正。
2023-02-09 17:34:42
1838
原创 GAMES101笔记:BRDF和渲染方程
BRDF描述的是如何把一个方向入射的能量反射到各个方向去。分子部分是某个反射方向ωr\omega_rωr的Radiance的微分分母部分是某个入射方向ωi\omega_iωi的Irradiance的微分。由于Irradiance是各个方向的Radiance累积起来的。因此这儿通过考察一个微小的微分立体角dωid\omega_idωi,这个Irradiance的微分就是入射的Radiance和微分立体角的乘积,以及为了投影受光表面还乘了cosθicos。
2023-02-03 13:05:12
728
原创 GAMES101笔记:辐射度量学(上)
Radiant Energy 是电磁辐射的能量。单位为“焦耳”,符号为Q。Radiant flux (power)是单位时间内辐射、反射、传输或接受的能量。其实就是功率,单位为瓦特(Watt)W。在光学中,一般使用单位流明(lumen)lm。注意,流明不等于瓦特:所谓的流明(LM)简单来说,就是指蜡烛一烛光在一公尺(1 公尺 = 1 米)以外的所显现出的亮度。一个普通40瓦的白炽灯泡,其发光效率大约是每瓦10流明,因此可以发出400流明的光。
2023-02-01 16:50:19
1194
原创 深入URP之Shader篇10: 深度值专题(1)
当平台使用翻转深度值方向时,Unity就会定义为1:在这些平台上,由于深度缓冲是翻转的,那么的范围也是1(near)到0(far)。同时clip space的z值范围是[near,0]。在shader中就要使用区分出这种情况做相应的处理。例如,当我们要从#endif而如果我们要手动操作clip space Z值时,也要多加注意了,比如下面这个情况。
2023-01-14 11:31:42
1214
原创 Unity InputSystem基础
已知问题:当屏幕上有多个on screen control时,将某一个control deactive会导致其他control状态混乱。如果选择了Auto-Swtich,则会自动切换当前的Scheme。然后可以在这个事件里面获取当前的Scheme,然后做一些有用的操作。在Editor模式运行时,会显示当前的User(从0开始),Control Scheme和Devices,比较方便观察设备切换。使用这个组件可以快速开发,只要设定所使用的InputActionAsset,并且绑定事件代码即可。
2023-01-05 12:39:23
935
原创 Unity联网多人游戏技术方案调研
以上方案/插件都是可以高度集成到Unity中,都是直接使用Unity C# API写逻辑的。现在有一些开源的或者自研的服务端方案,比如使用Go,Lua, C++, Rust, Java等开发的服务器,这种基本都是独立服务器DGS,服务器端就不能使用Unity的API写逻辑了,比如物理计算和寻路等,都要是有其他方案,脱离了Unity引擎,而客户端就要使用底层的网络代码,重新封装到游戏逻辑层。UNet是早期的方案,也被称为HLAPI (High Level API),提供了一系列高层组件进行快速的联网开发。
2023-01-05 12:18:44
2517
原创 Unity无缝大世界实现调研
无缝大世界的技术要求。世界足够大,一个地图就完整包含一个非常大的世界,如魔兽世界的整块卡利姆多大陆。面积从几平方公里到数十乃至上百平方公里。包含室外地形,城镇,也包含一定量的室内场景。室外地形包含各种地表,植被,河流,道路,山峰山谷,天空,云雾,光线。城镇场景包含大量的建筑和装饰物。室内场景也可能非常庞大,包含多个层次。
2023-01-05 12:10:03
3248
原创 深入URP之Shader篇9: SimpleLit Shader分析(5)
在前两篇中,FS的数据已经全部准备好了,本篇就重点看怎么计算光照的,这个Simple Lit有多Simple。另外本篇的另一个重点就是Unity的GI的使用,包括BakedGI和RealtimeGI,这些在这个Simple Lit里面都有用到。计算光照的核心函数就是,传入的参数除了InputData,还有之前计算出来的diffuse, specular, smoothness, emission和alpha。之后使用MixFog将光照计算出来的颜色和雾的颜色进行混合,最后使用计算最终的alpha值。
2023-01-03 17:51:13
1304
3
原创 深入URP之Shader篇8: SimpleLit Shader分析(4)
URP ShaderLibrary的Input.hlsl这个结构体包含了光照计算所需要的所有输入参数,有些参数是直接从Varying获取,有些是进一步计算得到。这个结构体大量用于URP的各个Shader中。而的作用就是设置这个结构体的各个成员值,这个函数名也是URP的一个惯例,很多shader中都会有这个函数,当然函数参数可能不一样,但是作用是一样的。我们看下SimpleLit Shader的这个函数吧。
2022-12-09 10:37:41
993
原创 深入URP之Shader篇7: SimpleLit Shader分析(3)
上篇中分析了Simple Lit Forward Pass的Vertex Shader都计算和输出了什么数据,本篇就看看在Fragment shader中是怎么使用这些数据计算最终的光照颜色的。由于代码较短,就都贴出来方便查看:首先进行的是Alpha Test之前在分析Depth Only Pass的时候就看过alpha test的处理,和这儿有些类似,但是由于Depth only pass更加通用,所以会在使用albedo贴图alpha的时候做一些判断,在某些情况下这个贴图的alpha是不用来做al
2022-12-07 10:44:37
1161
原创 深入URP之Shader篇6: SimpleLit Shader分析(2) Vertex Shader
看看在顶点shader中都计算了什么其中,函数位于SPR Core的中:这里面的却又位于URP的中:回到中,首先计算world space的法线和切线没啥问题,只不过变换法线需要用逆转置矩阵因此使用一个特定的函数,而变换切线使用普通的变换向量的函数即可,这两个函数自己写shader也经常用。而计算副切线是使用法线和切线的叉积,但是其结果需要校正符号。而这个符号是Object space切线的w和返回值的乘积。这个我暂时没弄清楚,按照之前掌握的知识,Object space切线的w的正负,是由DCC工
2022-12-06 11:03:40
1758
3
原创 深入URP之Shader篇5: SimpleLit Shader分析(1)
本篇开始分析simple lit shader。我们通过分析unlit shader了解了URP shader的结构,以及一些基础功能。而simple lit shader包含了更多的内容。本篇开始,就不会特别仔细的逐行去分析shader文件了,只会针对pass的功能中比较有意思且之前没看到过的内容进行分析。名字为的pass,它的Tags为:根据URP的文档:说明这是一个前向渲染路径的pass,虽然URP(至少是10.8.1版本)还没有正式支持Deferred Rendering,但URP已经为它打了很多
2022-12-05 11:21:37
1465
原创 深入URP之Shader篇4: Depth Only Pass
unlit shader中包含了一个Depth Only Pass,这个pass的代码在中。这是一个公共pass,几乎所有的URP shader都会包含这个pass。本篇说一说这个pass的作用以及实现细节。Depth only pass的作用是生成一张场景的深度图,一般是在渲染不透明物体之前,对所有包含该pass的材质对应的物体执行这个pass,当所有物体执行完毕后,就得到了深度图。这个pass执行的前提是URP判断需要深度图,比如URP assets中配置了:或者camera开启了后处理。使用深度图,游
2022-12-04 13:31:28
3179
原创 深入URP之Shader篇3: Unlit Shader分析[下]
上篇中我们分析了Unlit shader的Properties在ShaderGUI中的处理,接下来看Sub Shader。unlit shader以及其他URP shader包含两个SubShader,分别是针对ShaderModel4.5和2.0。由于unlit shader本身很简单,这两个SubShader几乎一样,唯一的差别是ShaderModel 4.5的SubShader会定义,这个可参考dots-instancing-shaders,本文中先忽略它。总之这儿的要点是URP会针对比较强大的设备使
2022-12-03 09:44:48
1562
1
原创 深入URP之Shader篇2: 目录结构和Unlit Shader分析[上]
我使用的Unity版本为2020.3.33f1,对应的URP和SRP Core版本为10.8.1。阅读URP源码建议把package从Library/PackageCache中拷贝到Packages目录,也就是自定义package的方式,然后推荐使用VS code打开工程,这样可以很方便的跳转代码阅读。
2022-12-02 18:23:11
2066
原创 深入URP之Shader篇1: URP Shader概述
我们知道,URP和HDRP都是基于SRP的,尽管现在可以使用Shader Graph编写Shader,但是手写Shader仍然是有一定的优势,特别是在性能方面,手写Shader可以更极致的优化,因此我们在项目中前期都是直接使用Shader Graph编写Shader,项目后期会改成手写Shader来提高性能。而在SRP中手写Shader,我们仍然使用的是Shader Lab,这个结构并没有太大的变化,但是SRP Shader中使用Shader Lab语言还是有几点不同。
2022-12-01 22:30:02
4175
原创 NVidia Maxwell GPU Tile-based 光栅化模式分析
视频所描述的实验,使用一个特定的shader去绘制一组三角形,这些三角形在shader中被设置顶点位置为屏幕的左上角,右上角和左下角。并且可以在Shader中设置三角形数量,全局可绘制的像素的百分比,每个三角形的顶点属性的floats数量,像素格式和采样数。即上图截图中,右下角的从上到下的选项。三角形的颜色是从7个设定好的颜色中选择,相邻三角形是不同的颜色。上图中,是使用了AMD的某个桌面GPU,是传统的立即渲染模式(IMR)。整个实验都绘制12个三角形。
2022-11-28 21:27:19
1361
原创 Unity自定义Timeline总结
自定义Timeline一定是为了满足某种需求,需要在Timeline编辑器上,编辑特定的Clip,以及对于Track绑定特定的对象。而Timeline中的clip在运行时都是Playable对象,这是Playable API中中的节点。在中,通常有Playable节点和两类节点。而Mixer节点其实也是一种特殊的Playable节点,比如。而我们自定义的Playable节点都是类型的节点。是一个泛型结构体,其泛型类型是实现接口的类。Unity提供了一个抽象类实现了。
2022-11-11 19:49:45
3025
原创 [Unity] 关于Unity Mirror的一点体会
Mirror可以在单机游戏中使用,用于将单机游戏改造成联网游戏,但是并不适合通常的CS模式的网络游戏。其他需要预测校正啊这种的都没有直接使用的方法,说白了除了位置同步这种有一些处理,其他的同步都只是直接发消息同步。说明用的人确实不多。我半个月在实际项目中初步使用,都发现很多地方都是需要自定义的,虽然暂时还不需要修改Mirror源码,但是至少所谓的高级功能都用到了。首先,Mirror这种HLAPI的网络库,是在一个工程中同时写服务器和客户端代码,这就造成两个问题。
2022-11-07 16:42:55
2167
4
原创 [Unity] IL2CPP编译VTable错误
原因是,项目使用了一个插件需要为AOT编译生成DLL,这个DLL里面包含了引用到的类型的stub 代码,这是为了防止这些类型被strip掉。但是由于代码重构,这个DLL中存在的一些stub类型对应的C#类型已经不存在了,但是由于DLL没有更新,导致IL2CPP处理VTable时找不到对象了。重新生成DLL就好了。这种错误会随机出现在不同的DLL上。大意是IL2CPP处理VTable时找不到一些object的引用。
2022-11-04 20:06:15
884
原创 Unity解决同材质物体重叠产生Z-Fighting的问题
在Unity中绘制多个可能部分或全部重叠的物体,这些物体可能是使用同一个材质,此时大概率会产生Z-FightingZ-Fighting的原因是片段计算出的深度值太接近了,从而不能确定哪一个离相机更近,互相竞争导致闪烁。那么解决思路就是让他们的Z值稍微有点区别。比较常见的解决方案是Polgon Offset,即Unity Shader Lab的Offset属性。但是对于使用同一个材质的物体,这个方法无效。因为这种物体互相重叠时即便在材质上设置了Offset,由于是同一个材质,计算出来的depth还是一样的,并
2022-07-12 16:32:34
3416
原创 Unity URP 中 GPU Instancing的使用
GPU Instacing开启的条件首先Shader必须兼容与Instancing。材质开启 Enable GPU InstancingSRP Batcher的优先级高于GPU Instancing,对于Game Objects,如果SRP Batcher能被使用(Shader兼容SRP Batcher,节点本身也兼容等),则就会使用SRP Batcher,即便材质开启了Enable GPU Instancing也没用。如果SPR Batcher的条件被破坏,例如使用了MaterialProper
2022-05-19 13:51:30
7148
1
WebGL Programming Guid (英文原版带目录)
2018-12-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人