1.UE中的源码着色器编程-需要重新编译内核自己生成UE
2.UE4学习笔记 使用插件添加一个ShadingModel
3.UE4源码剖析——光照贴图(LightMap) 之 由烘焙到渲染流程
4.Cocos Creator 3.x 开发2D水面波纹Shader
5.dx11ä¸çshaderç¼ç¨
6.Re:从零开始的UE渲染学习-4Shader与材质
UE中的着色器编程-需要重新编译内核自己生成UE
全球图形学领域的教育和研究者,东汉书院,源码致力于提供深入的源码技术教学和视频,帮助用户构建图形学知识体系。源码在这里,源码用户能获得全面的源码模型指标源码公式代码知识,以及背后故事的源码理解,避免盲目学习。源码书院提供深入剖析UE的源码课程,帮助有兴趣自研引擎的源码用户。UE源码版本为4.,源码为了简化学习,源码我们将切换至移动端渲染模式。源码
具体操作如下:
1. 修改Engine/Source/Runtime/Engine/Classes/Engine/EngineTypes.h文件,源码添加名为MSM_Alice的源码ShadingModel。
2. 修改Engine/Source/Runtime/Engine/Private/Materials/HSLSMaterialTranslator.cpp文件,在GetMaterialEnvironment函数中添加代码。
3. 修改Engine/Source/Runtime/Engine/Private/Materials/MaterialShader.cpp文件,扩展GetShadingModelString函数。
4. 编写shader代码,修改Engine/Shaders/Private/MobileBasePassPixelShader.usf文件,将材质球颜色固定,完成PostProcessing操作。最后创建材质球,选择Alice作为ShadingModel。
经过上述操作,UE将渲染出一个独特的材质球。完成此步骤后,用户将获得一个UE难以相信的渲染成果,仿佛在对UE表达不信任与讽刺。接下来,书院将提供更多高级内容,帮助用户参考UE,自行开发引擎。
东汉书院关注引擎底层技术和商业化信息,适合具有一定基础的用户。关注“图形之心”公众号了解企业信息和动态,“内核观察”公众号则提供独立的安卓源码 sqlite咨询与文章。书院致力于提供深入的技术教学和视频,帮助用户构建图形学知识体系,提升对底层技术的理解,最终实现自研引擎的目标。
UE4学习笔记 使用插件添加一个ShadingModel
此文章借鉴了以下三篇文章,在此对分享者表示感谢。
1. [UE4]插件添加ShadingModel
2. Ue4 使用MaterialCustomOutput自定义ShadingModel
3. UE4(虚幻)学习笔记--虚幻4.自定义shadermodel
在学习UE4渲染管线过程中,发现添加ShadingModel时,通常需要修改源码版引擎的源码。本文介绍一种无需修改引擎源码的方式,添加自定义ShadingModel,并定制延迟渲染的光照计算。
第一篇文章已详细介绍了修改思路,本文重点记录插件创建与添加模块的步骤。
以4..2版本为例,首先新建一个插件,模板选择Blank。新建完成后,打开plugins所在位置,进入source文件夹。
将ToonShader文件夹复制一份,改名为ToonShaderBootstarp,并将ToonShaderBootstarp文件夹中的ToonShader全部改成ToonShaderBootstarp(包括文件名与其中变量名)。
注意:在ToonShaderBootstrap.Build.cs文件中,需要在PrivateDependencyModuleNames.AddRange中加入"Projects","DeveloperSettings",否则在之后的修改和编译中会产生错误。
之后在插件根目录中的ToonShader.uplugin中添加该模块,然后重新生成sln,该模块就添加完成了。
编译成功后,将ToonShader.uplugin中ToonShaderBootstarp模块的Type改为"UncookedOnly",LoadingPhase改为"EarliestPossible",否则会报关联不上插件源码的错误。
编译成功后,进入引擎,新建C++ Class,选择MaterialExpressionCustomOutput类,电竞菠菜源码再新建一个Class,选择developerSettings类。
接下来修改ToonShaderOutput.h与ToonShaderOutput.cpp,编译通过后,继续修改ToonShaderBootstarp.cpp。
修改ToonShaderBootstrapSettings.h,增加插件的启动和关闭参数,然后修改配置文件的方法和正常修改源码添加ShadingModel的方法相似。
插件成功加载后,可以在Material里面看见ToonShader节点。
自定义ShadingModel添加完成。
总结:
1. ToonShader模块实现了UMaterialExpressionCustomOutput的子类,为运行时模块。
2. ToonShaderBootstrap模块在引擎启动Shader编译前加载,用以向虚幻引擎Shader文件夹中替换默认Shader文件。
ShadersOverride文件夹下存放了shader文件,Default文件用来恢复,Override用来做替换,新增的Shader文件都需要存放在Toon目录下。
本文记录了在UE4中踩的坑,希望对大家有所帮助。
UE4源码剖析——光照贴图(LightMap) 之 由烘焙到渲染流程
在离线编辑器阶段,通过构建(Build)按钮启动光照烘焙流程,UE4引擎在构建场景光照、反射球信息、预计算静态网格可见性、构建导航网格、构建HLOD、构建流式贴图等,仅关注光照相关只构建光照(Build Lighting Only)阶段,Lightmass系统负责计算光照,Swarm分布式工具加速并分担计算任务。
Swarm初始化并启动烘焙流程,Startup阶段计算光照构建的关卡与灯光信息,统计静态几何体数据并初始化Swarm,Swarm分为协调与代理程序,负责数据导出与任务分配。猜大小源码运营AmortizedExport阶段进行分摊式数据导出,SwarmKickoff阶段Swarm全面启动,AsynchronousBuilding阶段消费者程序执行任务,完成光照信息计算。AutoApplyingImport阶段根据配置决定是否自动导入烘焙结果,WaitingForImport与ImportRequested阶段等待导入烘焙数据,Import阶段完成数据导入,Finished阶段地图构建完成。
光照贴图合并大图过程,为每个静态几何体独立生成光照贴图后,UE4将多张贴图尽可能合并到一张大贴图中,以优化IO加载与渲染性能。合并算法简单,通过排序、读取最大尺寸限制与重新摆放光照贴图完成。
贴图像素设置与Mipmap生成,合并后的光照贴图设置像素值,为每种类型的光照贴图创建,最终将数据以真实形式存储。贴图包含SkyOcclusionTexture、AOMaterialMaskTexture、ShadowMapTexture与低分辨率系数贴图。
贴图渲染资源合并中,判断不同几何体使用的贴图集合是否一致,优化判断效率。创建FLightmapClusterResourceInput类代表贴图集合,并统计所有集合用于判断几何体是否使用相同贴图集合。
运行时光照贴图传递到Shader流程包括UE4几何体渲染架构窥探、光照信息存储、赋值LCI与生成渲染批次、绑定Shader。FLODInfo类存储光照信息,FMeshBatchElement中设置LCI字段,FBasePassMeshProcessor绑定贴图集合到Shader。在Shader代码中访问LightmapResourceCluster变量访问贴图集合中的光照贴图。
UE4通过Swarm分布式框架、Lightmass光照系统与优化的opencv人脸捕捉源码贴图合并与传递流程,实现了高效、实时的光照计算与渲染。
以上内容详细介绍了UE4引擎中光照贴图从烘焙到渲染的完整流程,包括分布式工具、数据合并、贴图存储与Shader访问,实现了高性能的光照计算与渲染。
Cocos Creator 3.x 开发2D水面波纹Shader
使用 cocos Creator 3.8 开发 2D 水面波纹 Shader 的过程和相关技术点总结如下:
2D 波浪基本原理:给定正选波边界,范围内的片元 uv 显示,范围外的片元 uv 不显示。利用正弦波表达式:y = A * sin(w * t + offset)。将片元的 uv 坐标 uv.x 带入公式计算 y0 值。Cocos 的 uv 左上角为 (0, 0),在上方做水波纹,片元的 uv.y y0 的片元丢弃,uv.y >= y0 的片元正常显示。
实现动态水波:不断改变相同位置的 offset,得到不同的 y0 值,决定不同片元的显示和丢弃,使水波动起来。
编写 Shader 步骤:
第步:新建标准 2D Shader 模板,正常显示。复制 buildin-sprite Shader 模板,创建材质并设置到 Sprite 组件上。
第步:定义控制参数:baseLine、振幅 A、角速度 wSpeed。
第步:修改 Fragment 着色代码,实现基准线功能。基准线以上的片元丢弃,基准线以下的片元保留。
第步:将基准线加上正弦波处理,offset 为 uv.x,值为 A * sin(offset),将 baseLine 转换为正弦波分界线。
第步:让正弦波动起来。在 sin 表达式中加上 w*t,其中 cc_time.x 为从启动后到现在的累计时间,随时间变化,value = A * sin(uv.x * .0 + wSpeed * cc_time.x),实现波形周期变化。
完整 Shader 代码:在 cocos Creator 3.8.0 中编写。
欲获取项目工程源码和更多教学视频,请关注我们。
dxä¸çshaderç¼ç¨
shaderè½ç¶æ¯ä»£ç ï¼ä¸è¬ä¸ç¼è¯å°exeä¸ï¼ä½ä¸ºèµæºæ件åå¨ï¼ä½ å é¤äºshaderçæºä»£ç ï¼å¯¼è´æ æ³å è½½shaderã
å¦æçè¦ç¼è¯å°äºè¿å¶çå¯æ§è¡æ件ä¸ï¼å¯ä»¥å°shaderæºç 以å符串形å¼åå¨å°æ个cppæºæ件ä¸ï¼è¿æ ·å è½½æ¶æä¾é£ä¸ªå符串就è¡äºã
Re:从零开始的UE渲染学习-4Shader与材质
通过前面的学习,我们知道在UE中渲染网格时需要指定一个shader。本文将深入讲解UE的Shader、材质系统以及它们之间的关联。所涉及的源码版本为UE5.3,所有配图已上传至Github,便于查看高清图。
顶点工厂的作用在于处理模型网格上的顶点信息,如位置、法线、UV等,UE通过顶点工厂使shader能够直接获取所需顶点数据,这简化了自定义网格信息的解释工作。
Shader是控制渲染物体在屏幕上的关键,通常需要指定VertexShader和PixelShader。在编写shader时,需要遵循特定的编程语言和标准,例如DirectX使用HLSL,OpenGL使用GLSL。UE通过一套规范来管理shader体系,最后将shader编译到支持的平台上。
Shader类是shader文件与实际渲染系统之间的桥梁。UE中有三种主要的shader类,分别针对材质编辑器的使用情况和顶点工厂类型。Shader实现主要依赖RDG提供的宏和函数,如声明宏、用于对着色器参数表达的宏等,以及为着色器类型声明必要的数据和函数的宏,实现将shader文件与shader类绑定。
材质系统是UE中用于定义物体属性的界面,包括质感、颜色、透明度等。shader提供材质属性的计算方式,而材质则通过指定shader来实现这些计算。UE的材质编辑器允许用户通过直观的操作设置材质属性,这些属性最终被转化为HLSL函数,由shader调用以计算光照效果。
在渲染过程中,材质、shader和顶点工厂紧密关联,形成渲染流程。UE会根据材质所使用的shader类型和顶点工厂类型编译出特定的组合结果,存储在材质的ShaderMap中。当使用BuildMeshDrawCommands()时,传入的shader是针对特定pass的完整shader。
材质类涉及游戏线程、代理和渲染线程相关的类,与材质蓝图的关联主要体现在UMaterialGraph上,它用于存储和管理材质节点和参数。UMaterialExpression管理节点的表达式,包括节点输入、名称和编译逻辑。拓展材质节点通常需要继承UMaterialExpression并实现相关函数,尤其是Compile()函数,直接决定节点如何被编译。
在进行材质编译时,UE首先翻译材质蓝图到HLSL代码,然后根据不同的组合进行编译,并存储到ShaderMap中。编译过程涉及环境设置,这影响宏的使用,进而影响shader效果。在将材质蓝图翻译到HLSL时,UE使用不同的翻译帮助函数,如FHLSLMaterialTranslator。
总的来说,Shader与材质是UE中不可或缺的部分,它们共同决定了物体如何在屏幕上呈现。本文介绍了UE中Shader和材质的基本概念、关联方式以及编译流程,同时也简要提及了自定义Shader和拓展材质节点的方法。
unity urp源码学习一(渲染流程)
sprt的一些基础:
绘制出物体的关键代码涉及设置shader标签(例如"LightMode" = "CustomLit"),以确保管线能够获取正确的shader并绘制物体。排序设置(sortingSettings)管理渲染顺序,如不透明物体从前至后排序,透明物体从后至前,以减少过绘制。逐物体数据的启用、动态合批和gpuinstance支持,以及主光源索引等配置均在此进行调整。
过滤规则(filteringSettings)允许选择性绘制cullingResults中的几何体,依据RenderQueue和LayerMask等条件进行过滤。
提交渲染命令是关键步骤,无论使用context还是commandbuffer,调用完毕后必须执行提交操作。例如,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,并按顺序提交渲染操作。
UE5实践1.配置环境以及简单的shadingmodel添加
环境配置:使用Windows 系统,Unreal引擎版本5.0.2,Rider版本.1.1,Epic Games。首先,需要关联GitHub账户以访问私有引擎源码,通过github.com/EpicGames/Unreal获取源码。
构建项目:解压源码后,执行Setup命令,等待下载引擎文件,大约需时G左右,注意预留足够的磁盘空间。接着运行GenerateProjectFiles生成项目文件,此时可以看到.sln文件,可使用Rider或Visual Studio打开并构建项目。构建过程中可能会耗时较长,例如在晚上:开始构建,次日3:左右完成,最终成功启动引擎。
解决BUG:启动引擎后可能会遇到模块加载问题,这通常与使用Rider导致的插件加载问题有关。解决方法是在代码中将相关插件的EnabledByDefault属性设置为false即可。
自定义着色模型:在配置环境后,可以参考相关文章进行自定义着色模型的添加。具体步骤包括修改C++文件中的EngineTypes.h、MaterialShader.cpp、Material.cpp、MaterialShared.cpp等文件,以实现着色模型的添加。同时,需要修改HLSLMaterialTranslator.cpp、ShaderMaterial.h、ShaderMaterialDerivedHelpers.cpp、ShaderGenerationUtil.cpp等文件,以完成Gbuffer的写入。此外,调整PixelInspectorResult.h、PixelInspectorResult.cpp、PixelInspectorDetailsCustomization.cpp等文件,以优化序列化显示。
修改着色模型部分:通过修改ShadingCommon.ush、Definitions.usf、BasePassCommon.ush、DeferredShadingCommon.ush、ShadingModelsMaterial.ush等文件,实现自定义着色模型的添加。同时,需要调整ToonShadingCommon.ush、ShadingModels.ush、BasePassPixelShader.usf文件,以支持多光源的自定义着色模型。
最终效果:通过上述步骤,可以实现自定义着色模型的添加,支持多光源渲染,并得到支持多光源的CustomShadingModel效果。此外,还存在一种无需修改引擎代码的方法实现自定义着色模型。