自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

聚焦游戏和图形引擎开发技术

Stay hungry, Stay foolish

  • 博客(300)
  • 资源 (1)
  • 收藏
  • 关注

原创 Skinned Mesh原理解析和一个最简单的实现示例

Skinned Mesh原理解析和一个最简单的实现示例 作者:n5 本文的github地址:https://github.com/happyfire/SkinnedMeshDemo

2008-10-19 23:24:00 38755 26

原创 深入URP之Shader篇15: Shader关键字和变体

每种关键字的组合对应的shader版本就是一个shader变体。所谓变体,就是同一份shader源码,由于启用了不同的关键字组合,经过编译器预处理就得到了最终不一样的shader代码。

2024-02-22 10:45:30 982

原创 CORS的原理以及在Node.js中的使用

前端浏览器中的JavaScript代码使用XMLHttpRequest对象或Fetch API等方法发起HTTP请求到不同域的服务器。当浏览器中的JavaScript代码发起跨域请求时,浏览器会执行CORS检查。它会检查请求的目标域(服务器的域)是否在服务器的响应头中包含了合适的标头。如果服务器允许该请求的来源,浏览器会继续发送请求。当服务器接收到请求并准备发送响应时,在响应头中设置标头,指定允许访问的域。这个标头可以是具体的域名,也可以是通配符(),表示允许任何域进行访问。

2023-10-31 19:05:56 358

原创 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 1088

原创 使用密钥访问远程主机

从某些云服务商处购买的主机,一般会给你root密码访问,如果在自己的电脑上经常要登录,每次都输入密码不是很方便。其实可以使用密钥访问。

2023-10-31 16:58:34 186

原创 深入URP之Shader篇14: GPU Instancing

首先,定义PerMaterial Uniform block时,要使用INSTANCING相关的宏和。这些宏的作用是将Uniform block定义成数组。需要注意的是,只有当同一个材质下面的不同Instance存在逐Instance不同的属性时,才需要将UnityPerMaterial的CBuffer改成使用这些宏,否则是不需要的,因为这些宏只是为了将属性定义成数组,然后可以使用Instance索引去得到数组里面不同Instance各自的属性。

2023-08-27 17:58:14 422

原创 docker私有注册表创建和使用

本文给出了一个具体的使用docker registry和nginx配置docker私有注册表的方案。

2023-06-28 19:33:49 851

原创 aws EC2实例私钥丢失解决方法

网上搜有很多种方法,我自己试了一个好使的记录一下,这个方法比较简单。原理就是使用clound init脚本创建一个具有管理员权限的新用户,并设置新的公钥。这样就可以使用这个新用户的私钥登录实例了。

2023-05-31 19:49:05 404

原创 Linux ~/.ssh目录详解和密钥对使用

Linux中,用于根目录下有一个.ssh目录,保存了ssh相关的key和一些记录文件。

2023-05-31 11:36:23 9193 2

原创 Ubuntu 22.04 安装到RAID1

弄一台Ubuntu内网服务器,要跑一些服务,为了可用性,准备组RAID1。

2023-05-30 18:36:21 3530 4

原创 深入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 1128 1

原创 深入URP之Shader篇12: 深度值专题(3)

深度图的定义在本篇中分析了深度图的生成,定义和采样,结合软粒子效果看了一下深度图和线性深度的应用。

2023-02-13 17:15:46 1311

原创 GAMES202 PCSS软阴影算法细节解析

在LearnOpenGL框架的基础上实现了一遍GAMES202的PCF+PCSS软阴影,之前学习GAMES202时一些没弄清楚的问题顺便搞清楚了。注:本文中代码和shader均在笔者中实现,因此有一些细节可能和GAMES202作业框架不一致,且对202框架中的一些错误进行了修正。

2023-02-09 17:34:42 1160

原创 深入URP之Shader篇11: 深度值专题(2)

本篇简单总结了URP Shader中使用线性深度以及重建世界坐标的方法。

2023-02-06 11:21:30 694

原创 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 568

原创 GAMES101笔记:辐射度量学(下)

辐射度量学的重要概念Irradiance和Radiance解析

2023-02-01 17:47:29 453

原创 GAMES101笔记:辐射度量学(上)

Radiant Energy 是电磁辐射的能量。单位为“焦耳”,符号为Q。Radiant flux (power)是单位时间内辐射、反射、传输或接受的能量。其实就是功率,单位为瓦特(Watt)W。在光学中,一般使用单位流明(lumen)lm。注意,流明不等于瓦特:所谓的流明(LM)简单来说,就是指蜡烛一烛光在一公尺(1 公尺 = 1 米)以外的所显现出的亮度。一个普通40瓦的白炽灯泡,其发光效率大约是每瓦10流明,因此可以发出400流明的光。

2023-02-01 16:50:19 584

原创 深入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 970

原创 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 783

原创 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 2014

原创 Unity无缝大世界实现调研

无缝大世界的技术要求。世界足够大,一个地图就完整包含一个非常大的世界,如魔兽世界的整块卡利姆多大陆。面积从几平方公里到数十乃至上百平方公里。包含室外地形,城镇,也包含一定量的室内场景。室外地形包含各种地表,植被,河流,道路,山峰山谷,天空,云雾,光线。城镇场景包含大量的建筑和装饰物。室内场景也可能非常庞大,包含多个层次。

2023-01-05 12:10:03 2487

原创 深入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 943 3

原创 深入URP之Shader篇8: SimpleLit Shader分析(4)

URP ShaderLibrary的Input.hlsl这个结构体包含了光照计算所需要的所有输入参数,有些参数是直接从Varying获取,有些是进一步计算得到。这个结构体大量用于URP的各个Shader中。而的作用就是设置这个结构体的各个成员值,这个函数名也是URP的一个惯例,很多shader中都会有这个函数,当然函数参数可能不一样,但是作用是一样的。我们看下SimpleLit Shader的这个函数吧。

2022-12-09 10:37:41 703

原创 深入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 873

原创 深入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 1405 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 1095

原创 深入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 2064

原创 深入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 1309 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 1611

原创 深入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 3347

原创 NVidia Maxwell GPU Tile-based 光栅化模式分析

视频所描述的实验,使用一个特定的shader去绘制一组三角形,这些三角形在shader中被设置顶点位置为屏幕的左上角,右上角和左下角。并且可以在Shader中设置三角形数量,全局可绘制的像素的百分比,每个三角形的顶点属性的floats数量,像素格式和采样数。即上图截图中,右下角的从上到下的选项。三角形的颜色是从7个设定好的颜色中选择,相邻三角形是不同的颜色。上图中,是使用了AMD的某个桌面GPU,是传统的立即渲染模式(IMR)。整个实验都绘制12个三角形。

2022-11-28 21:27:19 844

原创 Unity自定义Timeline总结

自定义Timeline一定是为了满足某种需求,需要在Timeline编辑器上,编辑特定的Clip,以及对于Track绑定特定的对象。而Timeline中的clip在运行时都是Playable对象,这是Playable API中中的节点。在中,通常有Playable节点和两类节点。而Mixer节点其实也是一种特殊的Playable节点,比如。而我们自定义的Playable节点都是类型的节点。是一个泛型结构体,其泛型类型是实现接口的类。Unity提供了一个抽象类实现了。

2022-11-11 19:49:45 2408

原创 [Unity] 关于Unity Mirror的一点体会

Mirror可以在单机游戏中使用,用于将单机游戏改造成联网游戏,但是并不适合通常的CS模式的网络游戏。其他需要预测校正啊这种的都没有直接使用的方法,说白了除了位置同步这种有一些处理,其他的同步都只是直接发消息同步。说明用的人确实不多。我半个月在实际项目中初步使用,都发现很多地方都是需要自定义的,虽然暂时还不需要修改Mirror源码,但是至少所谓的高级功能都用到了。首先,Mirror这种HLAPI的网络库,是在一个工程中同时写服务器和客户端代码,这就造成两个问题。

2022-11-07 16:42:55 1608 1

原创 [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 752

原创 Unity解决同材质物体重叠产生Z-Fighting的问题

在Unity中绘制多个可能部分或全部重叠的物体,这些物体可能是使用同一个材质,此时大概率会产生Z-FightingZ-Fighting的原因是片段计算出的深度值太接近了,从而不能确定哪一个离相机更近,互相竞争导致闪烁。那么解决思路就是让他们的Z值稍微有点区别。比较常见的解决方案是Polgon Offset,即Unity Shader Lab的Offset属性。但是对于使用同一个材质的物体,这个方法无效。因为这种物体互相重叠时即便在材质上设置了Offset,由于是同一个材质,计算出来的depth还是一样的,并

2022-07-12 16:32:34 2716

原创 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 5339 1

原创 Unity使用shader渲染时的操作顺序

确定Active SubShaderSubShader列表Unity在使用一个Shader Object之前,会创建一个SubShader列表,将该Shader Object中所有的SubShader加入该列表中。并且也会把fallback shader object的所有SubShader加入到这个列表中。Active SubShader选择当第一次使用这个Shader object渲染几何体时,或者当shader LOD value改变时,又或者当前激活的render pipleline改变时,

2022-04-14 12:43:36 3184

原创 Unity内置管线Projector原理分析

Unity 内置管线的Projector功能Unity内置管理的Projector功能还是比较简单的。首先给投影体加一个 Projector组件:这个Projector定义了一个视锥体,可以是透视投影也可以是平行投影。场景中和这个视锥体相交的物体会绘制投影纹理。所以总的效果就是投影体镜头上的贴图(材质)被绘制在场景物体中,例如上图的两个Plane和一个Cube。投影纹理的原理这儿使用的技术叫做 Projective Texture Mapping,使用这个关键词可以搜索到一篇论文。基本原理是对于

2022-04-01 19:38:46 7187

原创 基于Unity的软光栅实现(3):基于Job system的多核加速光栅化

文章目录系列文章导航拥抱CPU多核计算Job System简介ParallelFor Job系列文章导航本系列文章是关于本人的开源项目 URasterizer: A software rasterizer on top of Unity, accelerated by Job system & Compute Shader的总结和介绍,一共四篇。第一篇:基于Unity的软光栅实现(1):框架搭建和矩阵构造第二篇:基于Unity的软光栅实现(2):CPU单线程软光栅第三篇:基于Unity的软

2022-03-30 14:50:21 4674 2

原创 基于Unity的软光栅实现(2):CPU单线程软光栅

文章目录CPURasterizer渲染数据: CPURenderObjectData输入数据中间输出数据缓冲区缓冲区定义清除缓冲区视锥剔除顶点变换图元集成ClippingBackface cullingViewport transform光栅化三角形透视校正插值片段着色MSAA输出到贴图CPURasterizer本篇介绍基于CPU单线程的软光栅渲染器 CPURasterizer。包括数据准备,缓冲区构建,顶点变换,图元集成,光栅化和片段着色,MSAA等内容,基本就是一个完整的光栅化流水线了。渲染数据:

2022-03-23 16:00:53 2801

WebGL Programming Guid (英文原版带目录)

WebGL Programming Guid (英文原版带目录),OpenGL ES programming Guid作者又一力作

2018-12-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除