1.unity urp源码学习一(渲染流程)
2.urp管线和unity内置管线有哪些区别,门精码好在哪里?
3.技术美术(TA)技术部分文章汇总(持续更新)
4.UGUI源码阅读之Mask
5.Unity源码学习遮罩:Mask与Mask2D
unity urp源码学习一(渲染流程)
sprt的一些基础:
绘制出物体的关键代码涉及设置shader标签(例如"LightMode" = "CustomLit"),以确保管线能够获取正确的源码r源shader并绘制物体。排序设置(sortingSettings)管理渲染顺序,门精码如不透明物体从前至后排序,源码r源透明物体从后至前,门精码以减少过绘制。源码r源欢乐麻将2.0 源码逐物体数据的门精码启用、动态合批和gpuinstance支持,源码r源以及主光源索引等配置均在此进行调整。门精码
过滤规则(filteringSettings)允许选择性绘制cullingResults中的源码r源几何体,依据RenderQueue和LayerMask等条件进行过滤。门精码
提交渲染命令是源码r源关键步骤,无论使用context还是门精码commandbuffer,调用完毕后必须执行提交操作。源码r源例如,门精码context.DrawRenderers()用于绘制场景中的网格体,本质上是执行commandbuffer以渲染网格体。
sprt管线的基本流程涉及context的命令贯穿整个渲染流程。例如,首次调用渲染不透明物体,随后可能调用渲染半透明物体、天空盒、特定层渲染等。流程大致如下:
多相机情况也通过单个context实现渲染。
urp渲染流程概览:
渲染流程始于遍历相机,共享日历源码如果是游戏相机,则调用RenderCameraStack函数。此函数区分base相机和Overlay相机:base相机遍历渲染自身及其挂载的Overlay相机,并将Overlay内容覆盖到base相机上;Overlay相机仅返回,不进行渲染操作。
RenderCameraStack函数接受CameraData参数,其中包含各种pass信息。添加pass到m_ActiveRenderPassQueue队列是关键步骤,各种pass类实例由此添加至队列。
以DrawObjectsPass为例,其渲染流程在UniversialRenderer.cs中实现。首先在Setup函数中将pass添加到队列,执行时,执行队列内的pass,并按顺序提交渲染操作。
urp管线和unity内置管线有哪些区别,好在哪里?
在游戏开发领域,了解不同的渲染管线对提高工作效率和优化游戏性能至关重要。其中,URP(Universal Render Pipeline)和Unity内置管线在实现高质量渲染方面各有特色,本文将深入探讨它们之间的区别及各自的优点。
URP和Unity内置管线在基础策略和渲染处理上存在显著差异,这直接影响到了Shader的编写方式。在URP渲染管线下,使用的买源码合同是HLSL(High-Level Shader Language)开发Shader,而传统的向前渲染管线则基于Cg语言。这种语言差异为URP提供了更多灵活性和性能优化的机会。
URP渲染管线引入了内置的PBR(Physically Based Rendering)、Unlit、地形等常用Shader,为开发者提供了丰富的资源和现成的解决方案。URP Shader的源代码位于Packages/Universal RP/Shaders目录下,便于参考和学习。相比于标准的Unity Shader,URP Shader内嵌了HLSL代码,简化了复杂性并提高了性能。
在URP渲染管线中,Unlit Shader主要用于绘制3D物体,它采用Unity经典的ShaderLab语法,结构包括SubShader和Pass部分。Unlit Shader有两个SubShader版本,通过ShaderModel版本进行区分,分别对应不同的应用场景。Pass部分包括Unlit Pass、Depth Only Pass和Meta Pass,分别负责绘制、深度测试和静态光照烘焙。
接下来,我们探讨了URP PBR Shader的交友源码分享实现,它支持物理光照、金属度与粗糙度等参数,提供更精确的渲染效果。PBR Shader结构遵循ShaderLab语法,内嵌HLSL Shader编程语言,拥有多种Pass,包括ForwardLit Pass、ShadowCaster Pass等,分别负责3D物体渲染、阴影计算和深度测试等关键步骤。
在光照计算方面,URP PBR Shader通过一系列步骤进行处理,包括初始化双向分布函数BRDF、计算主光源光照、处理全局光照、附加光源光照和自发光等。这种分离式的光照计算方法,使得URP渲染管线在实现高质量渲染效果的同时,优化了性能。
综上所述,URP渲染管线与Unity内置管线在Shader编写、光源处理和光照计算等方面存在明显差异,这些差异为开发者提供了多样化的选择和优化策略。通过深入理解这些差异,投资机构源码开发者能够根据项目需求和性能目标,选择最适合的渲染管线来实现高质量的游戏渲染。
技术美术(TA)技术部分文章汇总(持续更新)
本文汇集了作者个人学习路径中的关键技术资源,旨在分享给需要的朋友们,希望有所帮助。 学习顺序大致按照作者的实践路径展开:首先从Unity的内置管线开始,包括SRP和URP自定义管线,作为技术基础,为后续图形算法的实现打下基础。这是第一阶段,主要涉及实践和理论理解。
接下来是深入研究Unity引擎,从官方教程入手,特别是材质部分,然后逐步理解源码并进行修改,这是第二阶段,侧重于实践和代码理解。
学习过程中,切忌急于求成,如UnityShader相关资源,如Unity Standard Shader技术分析和内置着色器源码剖析,都是逐步突破的阶段。
算法实现方面,通过庄懂老师的课程,理解技术美术如何服务于艺术表达,如兰伯特模型的灵活运用。 对于Shader,从SRP到URP的转换路径有指导意义,比如官方资源和社区分享的文章。继续深入,光追技术的学习从基础的raytracing系列文章开始,然后是Unity的光追实现,以及全局光照和路径追踪等技术。
PBR(物理基础渲染)是另一个重要领域,包括光照模型、阴影处理等,推荐的书籍和实践指南不容忽视。
在实时渲染和图形基础渲染管线的学习中,Unity的官方资源和Games系列教程是关键,以及GAMES课程的实践作业。 理解计算机图形学的数学基础,如几何、光影、纹理处理等,以及提升英文阅读能力来阅读专业文献,是持续学习的关键。 论文阅读和GDC资源的获取也至关重要,积累知识,扎实基础,从经典论文和官方教程开始,逐渐扩大视野。 最后,建议多实践,深入理解渲染管线,关注技术美术的Todo和社区分享,持续探索和学习。UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的模版测试。
Unity Shader中的模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,但是现在又出现了Early Fragment Test,可以在片元着色器之前进行。
Mask直接继承了UIBehaviour类,同时继承了ICanvasRaycastFilter和IMaterialModifier接口。
Mask主要通过GetModifiedMaterial修改graphic的Material。大致流程:
1.获取当前Mask的层stencilDepth
2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存
3.StencilMaterial.Add设置一个unmaskMaterial,用于最后将模板值还原
MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的Mask层数,然后StencilMaterial.Add修改模板测试的配置。
通过Frame Debugger看看具体每个batch都做了什么。先看第一个,是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的stencil buffer的值设置为1
这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3
这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值
这是Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer
这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer
可以看到Mask会产生比较严重的overdraw。
2.drawcall和合批
每添加一个mask,一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。
如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批
如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。
Unity源码学习遮罩:Mask与Mask2D
Unity源码学习遮罩详解:Mask与Mask2D UGUI裁切功能主要有两种方式:Mask和Mask2D。它们各自有独特的原理和适用场景。1. Mask原理与实现
Mask利用IMaskable和IMaterialModifier功能,通过指定一张裁切图,如圆形,限定子元素的显示区域。GPU通过StencilBuffer(一个用于保存像素标记的缓存)来控制渲染,当子元素像素位于Mask指定区域时,才会被渲染。 StencilBuffer像一个画板,每个像素有一个1字节的内存区域,记录是否被遮盖。当多个UI元素叠加时,通过stencil buffer传递信息,实现精确裁切。2. Mask2D原理
RectMask2D则基于IClippable接口,其裁剪基于RectTransform的大小。在C#层,它找出所有RectMask2D的交集并设置剪裁区域,然后Shader层依据这些区域判断像素是否在内,不满足则透明度设为0。 RectMask2D的性能优化在于无需依赖Image组件,直接使用RectTransform的大小作为裁剪区域。3. 性能区别
Mask需要Image组件,裁剪区域受限于Image,而RectMask2D独立于Image,裁剪灵活。因此,Mask2D在不需要复杂裁剪时更高效。 总结:虽然Mask和Mask2D各有优势,选择哪种遮罩取决于具体需求,合理使用能提高性能和用户体验。