简介关于游戏开发中基于图像的渲染(Image-Based Rendering,简称IBR)技术的方方面面,将总结《RTR3》书中第十章提到的16种常用的IBR渲染技术
渲染谱 The Rendering Spectrum
固定视角的渲染 Fixed-View Rendering
天空盒 Skyboxes
光场渲染 Light Field Rendering
精灵与层 Sprites and Layers
公告板 Billboarding
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105//ScriptableRenderer.csprivate static void CalculateBillboard...
简介细节层次(Level of Detail,LOD)的基本思想是当物体对渲染出图像贡献越少,使用越简单的形式来表达该物体。这是一个已经在各种游戏中广泛使用的基本优化技术
链接Github 浅墨 游戏开发中的渲染加速算法总结19.9 细节层次(LOD) - Justin的文章 - 知乎
过程
生成
生成不同细节的模型表示
选择
基于某种准则选取一个层次细节模型,比如屏幕上的评估面积
切换
从一个细节层次转换到另一个细节层次的过程
LOD切换技术
Discrete Geometry LODs(离散几何 LOD)
离散几何LOD是最简单的LOD算法,不同的表示是不同图元数量的同一模型,但这种方法突越现象严重
离散几何LOD是一种LOD算法,即层次细节模型,是一种实时三维计算机图形技术,可以根据物体对渲染出图像的贡献程度,选择不同数量的几何体来表达该物体
这种算法非常适合现代图形硬件,因为这些单独的静态网格可以存储在GPU内存中并重用
但是,这种算法也有一个缺点,就是当从一个LOD切换到另一个LOD的时候,会产生突跃现象,即模型的忽然替换会引起观察者的注意
Blend...
简介记录常用的剔除技术
链接AssetStore一篇文章彻底弄懂齐次裁剪 - Clawko的文章 - 知乎 齐次空间下的裁剪CSDNGithub 浅墨 游戏开发中的渲染加速算法总结
背面裁剪背面裁剪是一种渲染性能优化的技术,它是将背向视点的物体或多边形删除,避免进行不必要的光栅化和深度测试。背面裁剪可以根据多边形的法向量或顶点的索引顺序来判断是否背向视点。背面裁剪是一种非常简单直观的操作,只能一次一对个单一多边形进行操作。
一般在光栅化阶段进行,在顶点着色器输出的顶点转换为片元的过程中,根据三角形的顶点顺序和法向量来判断哪些片元是背面,然后丢弃他们,减少片元着色器的工作量
根据三角形的三个顶点计算法向量,摄像机和三角形任意顶点的向量,点乘结果正负判断正面背面
视锥裁剪利用空间数据结构,可以分层地来应用这种裁剪。例如,对于层次包围体BVH来说,从根节点进行先序遍历(Preorder Transversal),就可以完成这一任务
除了层次包围体,其他的空间数据结构同样也可以用于视锥裁剪,包括上文提到的八叉树和BSP树。但是当渲染动态场景时,这些方法便会显得不够灵活,不如层次包围体
...
简介记录从GDC2023里学的东西
车漆效果GDC2023干货分享 90帧高质量写实手游的程序实现与美术设计 - 网易游学的文章 - 知乎
王牌竞技中的汽车涂层使用了双层BRDF和双层法向量
双层BRDF可以分为两个部分:表面层和基底层,每个部分都有自己的BRDF函数。表面层通常是一个镜面反射,基底层通常是一个漫反射。两个层之间有一个菲涅尔项来计算光线在表面层和基底层之间的反射和透射比例,网易提供的图片中,正中位置也存在着对于周边环境的反射结果,或许是通过 Lerp(base,base+surface,value) 插值的方式控制
Bing大小姐提供的伪代码
123456789101112131415161718192021222324252627# 定义表面层的BRDF函数,这里假设是一个Cook-Torrance模型def surface_brdf(L, V, N, H): # 计算菲涅尔项,这里假设是一个Schlick近似 F = surface_fresnel + (1 - surface_fresnel) * (1 - dot(V, H)) ** 5 ...
分块管理(空间数据结构上的优化)在考虑大场景的情况下,可能存在几百万乃至更多的草,如果每帧都去进行可见性剔除,开销过大。所以选择使用空间加速算法来优化,通过划分多个AABB,根据AABB是否与摄像机裁剪区域相交、包含,再进行具体草的剔除
图形引擎实战:一种大世界巨量植被管理与渲染方案 - 搜狐畅游引擎部的文章 - 知乎
CPU裁剪对于草的数据构建一个BVH树,使用AABB包围指定数量的草,通过判断AABB是否与摄像机区域交相、包含,决定是否传递数据给GPUUnityURP-MobileDrawMeshInstancedIndirectExample
作者AABB裁剪的思想
1234567891011121314for (int i = 0; i < cellPosWSsList.Length; i++){ //create cell bound Vector3 centerPosWS = new Vector3 (i % cellCountX + 0.5f, 0, i / cellCountX + 0.5f); centerPosWS.x = M...
简介Gran Turismo色调映射是一种颜色变换技术,通过改变HSV色彩空间的色调H值并采样色调映射纹理来产生平滑的颜色变化,将颜色从HDR转为LDR
实现步骤
Shader中将输入的RGB颜色空间转换到HSV颜色空间
改变HSV空间的色调H值,可以通过时间或其他参数进行变化。色调H值的变化范围是0到1
根据变化的色调H值采样色调映射纹理,得到新的RGB颜色
将原始RGB颜色和新的RGB颜色进行线性插值,得到最终输出颜色。插值因子由外部设定,控制颜色变换的强度
1234567891011121314float4 Frag(Varyings input) : SV_Target{ // Lut space // We use Alexa LogC (El 1000) to store the LUT as it provides a good enough range // (~58.85666) and is good enough to be stored in fp16 without losing precision in the //...
简介记录 Xlua2018 中的资源管理方式,AB打包工具、AB加载、AB调试、资源缓存等等模块
AssetBundle资源到AB的映射Manifest中存储AB间的依赖关系
加载机制加载 Asset 时,创建 Asset 加载器,根据 Asset 对应的 AB,创建 AB 加载器,如果有多个依赖,则创建多个 AB 加载器,AB 加载器通过 AssetBundleCreateRequest 进行资源的拉取。加载完后,将 AB 中的 Asset 置入缓存中,释放 AB。加载器根据缓存中是否存在 Asset 来判断是否加载完成
打包机制打包流程
AB 检测
切换渠道
构建 AB 包
后期处理
AB 编辑器工具包括打包工具(包括 AB 构建)、AB 分发器可视化配置、ABMangaer 调试工具
资源预加载在场景切换时,进行场景所需资源的预加载
资源缓存池
简介记录研究卡通渲染时的内容
眼睛二次元角色卡通渲染—眼睛篇 - MIZI的文章 - 知乎
视察映射实现眼睛的凹凸感123456#if defined(_Parallax_Eye) half3 VT = lightData.viewDirectionTS; half parallax_mask=smoothstep(1.0,0.5,(distance(input.uv,half2(0.5,0.5))/0.4)); half2 parallax_offset=(VT.xy/(VT.z+0.42f))*_EyeParallaxOffset*parallax_mask; baseColorFinal= SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv+parallax_offset) * _MainColor;#endif
环境反射高光在shader中结合Flipbook播放
MatcapMatcap是一种材质渲染技术,它通过采样一张预计算的材质图片(Matcap texture)来达到渲染材质的效果。M...
简介简单记录下,URP 中 Lit 如何实现光照计算
后处理
Boom抗锯齿雾效LUTColor Lookup组件ColorLookup.cs
1234567891011121314if (hdr){ material.EnableKeyword(ShaderKeywordStrings.HDRGrading);}else{ switch (m_Tonemapping.mode.value) { case TonemappingMode.Neutral: material.EnableKeyword(ShaderKeywordStrings.TonemapNeutral); break; case TonemappingMode.ACES: material.EnableKeyword(ShaderKeywordStrings.TonemapACES); break; default: break; // None }}
ApplyColorGrad...
描述记录战斗系统中,用到的动画知识点
效果
你的浏览器不支持播放该视频
Curves在 AnimationClip 的 Curves 中设置,控制 Parameters 的变化在播放动画中,设置 AnimationMove 值,脚本通过读取这个值,控制人物进行偏移
123456private void UpdateAnimation() { if (characterAnimator.CheckAnimationTag("Battle")) { CharacterMoveInterface(transform.forward, characterAnimator.GetFloat(animationMoveID) * animationMoveScale, true); }}
Events在 AnimationClip 的 Events 中设置,进行事件的派发
攻击者OnAnimationAttackEvent事件,进行攻击事件的派发,参数为 hit_light(轻攻击)...