avatar
文章
24
标签
15
分类
31
Home
Archives
Tags
Categories
About
雪之湖畔 - SnowyLakeSideSnowyArkEngine开发笔记[0x00]: 写在最前 返回首页
搜索
Home
Archives
Tags
Categories
About

SnowyArkEngine开发笔记[0x00]: 写在最前

发表于2023-06-12|更新于2026-06-24|Game EngineSnowyArk
|浏览量:
文章作者: SnowyLake
文章链接: https://snowylake.net/post/230612-snowyark-dev-0x00.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雪之湖畔 - SnowyLakeSide!
Cpp
cover of previous post
上一篇
来点图程破防乐子
快过年了,不要再讨论什么C++,图形学,模板元之类的了,你带你的C++语言的设计与演化回到家并不能给你带来任何实质性作用,朋友们打开UE4连连看就做出了好看的特效,你默默的在家里瞪着两眼看GAMES、may佬和侯捷的视频。 亲戚朋友们吃饭问你收获了什么,你说我读完了RTR4和PBRT,系统的研究了基于物理的渲染和非真实感渲染,还用C++20重构了自己的渲染器。亲戚们懵逼了,你还在心里默默嘲笑他们,笑他们不懂C++和计算机图形学,不懂光照方程,不懂RAII和CRTP,也笑他们连Shader是什么都不知道。 你父母的同事都在说自己儿女一年的收获,有的用Java做了个网站后端赚到了第一笔外快,有的用Python做了点数据可视化发到B站成了up主,有的学了Unity和C#做独立游戏已经发售了。 你的父母默默无言,说我的儿子买了一整套的Effective C++,上Stack Overflow痛骂了C++标准委员会,写了一堆狗屁不通报错几百几千行的模板元编程代码,还对着谷歌翻译啃Ray Tracing the Rest of Your Life,人也越来越魔怔了。 原文链接: https...
cover of next post
下一篇
为美好的URP献上解析[0x00]: 管线架构
相关推荐
cover
2024-07-12
从插件开始的UE渲染开发0x00: Shader路径重定向
UE 渲染开发一直以来都是个很蛋疼的话题, 拜屎山一般的渲染系统所赐, 想要加点什么东西基本就只有改源码一条路可走, 以至于网上搜十个改源码的文章可能九个都是教你怎么加 ShadingModel 或 MeshPass. 我自己也曾在这类重复且枯燥的工作上花费大量的时间, 深切感受到这玩意到底有多恶心. 而且源码修改一时爽, 后续维护火葬场, 将来如果要升级引擎版本, 面对茫茫多的 diff 那才叫一个痛不欲生. 所以这个系列从 UE 的插件系统(Plugin)入手, 尝试探索在不改动源码的情况下, 如何最大限度的自定义渲染. 虽说不改 C++ 源码, 但 Shader 该改还是要改. 不过直接去引擎路径下改 Shader 就很恶心, 可能我只想为当前项目改动某部分 Shader, 但引擎路径下 Shader 的改动却会影响到本地的所有项目. 如果能像 Unity 那样每个项目自己有一份 Shader 就好了——正确的, 我们就先来把这个功能做了. 在动工之前, 需要先理解 UE Shader 的路径引用原理. UE shader 代码中 include 的文件路径并非真实的路径...
cover
2023-09-11
从零开始的UE5卡通渲染0x00:理论基础
最近在研究基于UE5的卡通渲染,颇有收获。正巧前段时间与同事吃饭,聊到知乎,深感自己知乎各种不正经的东西实在太多了,而我又是个懒得腾出时间写正经东西的懒狗,遂决定趁编译Shader的空闲,写点学习笔记、心得与分享。 虽然卡渲本身的知识不算很多,但放到UE5上就是不得不改动源码的大工程了,不由得让人怀念起自由的Unity,令人感叹……扯远了,总之UE5卡渲这块我准备分成多篇文章,多水一水。 目前的大(feng)致(kuang)计(hua)划(bing)如下: 卡通渲染理论基础 修改源码的卡渲光照模型实现 基于卷积矩阵的卡渲描边实现、添加子Mesh的Backface卡渲描边实现 修改源码自定义Pass的Backface卡渲描边实现 …… 次世代卡渲/独立的Hair、Skin卡渲光照模型/UE5复刻原神ShadingModel……(或许会有?) 废话不多说了,进入正题。 提到卡通渲染,很多了解不多的朋友可能就会将其与NPR(Non-Photorealistic Rendering)混为一谈,可实际上这两者并不能划等号。事实上NPR是个非常广泛的概念,不止是卡渲,油画、水墨风等等...
cover
2023-09-11
UE5.1移动端延迟管线基于Light Channels模拟Unity Rendering Layers
在实际项目中会有这样一种需求,我们想要对某个或某一类物体,比如角色,单独打光,但同时又想让场景中所有物体的阴影都依赖于同一个主光源。 比如这样,Unity 截图: 上图右边球体不受场景主光,也就是左侧定向光影响,而是单独打光,同时却能通过场景主光投射阴影。这在 Unity 中可以通过 Rendering Layers,也就是 Light Layer + Custom Shadow Layer 轻松实现。 而 UE 并没有像 Unity Rendering Layer 这么方便的系统,只有三个通道的 Light Channels 也并没有那么自由,做不到光源只投射阴影而不着色,至少据我所知。 不过经实验,在 UE5.1 移动端可以钻 Light Channels 的空子来实现这一效果。 UE5.1 对移动端 Light Channels 支持了一波,但依旧有限制,其规则具体来说就是: 一个光源只能有一个 light channel。如果勾选多个 light channel,则着色时应用规则: light channel[A][B] = light channel[min(A...
cover
2023-09-11
从零开始的UE5卡通渲染0x01:自定义着色模型
简单写完了第一篇没啥营养的概述后,这一章我们来做一点真东西,通过修改源码添加一个Custom Shading Model,并使其可以集成我们上一篇文章提到的BaseColor、ILM、SSS贴图进行卡通渲染。 这里我使用的引擎版本是UE5.0.2。 拉取源码版UE5并编译 想要对源码做修改,绝对逃不开的第一步自然就是拉源码和编译。关于这一步,知乎上有大量的资料,官方文档写得也非常详细,我这种懒狗肯定不会再写一遍,不过还是有几点需要注意,值得说一下: 源码工程目录一定要放在固态硬盘里 预留大约250G的硬盘空间 建议整块好的CPU,框框越多越好,再多插几根内存条……不然的话等编译的空闲你还可以抽时间去学学Unity 😃 C++部分 C++部分大多都在进行Shading Model注册、开放和修改数据接口的工作,这里直接上截图。 EngineTypes.h \Engine\Source\Runtime\Engine\Classes\Engine\EngineTypes.h 在枚举EMaterialShadingModel 中注册我们的Shading Model: M...
cover
2023-09-11
UE5.1移动端延迟渲染管线测试与剖析
UE5.1对移动端延迟渲染做了一波大更新,在只使用3张gbuffer(不算SceneColor和Depth)的情况下支持了桌面端全部的shadingmodel,并且对Vulkan、Metal甚至是GLES都做了On Chip Memory的带宽优化。正好前面我刚折腾完Unity 2021.3的延迟管线,就顺便看看UE5.1这边有什么新花样。 官方talk: 虚幻5的移动端延迟渲染技术到底有多好用? - 腾讯游戏学堂的文章 - 知乎 https://zhuanlan.zhihu.com/p/562673914 经测试&查阅源码后确认支持的feature directional light可以有多盏(必须位于不同light channel), 只有一盏可以投射阴影 point light数量不再有限制, 不支持阴影 spot light可以投射阴影 每个light均只能有一个light channel 物体可以有多个light channel(即可以同时受多个light channel光源影响) 半透明效果正常 gles/vulkan均支持On Chip Memor...
cover
2023-09-11
关于std::optional传递开销的讨论与优化
在讨论std::optional之前,我们应该先适当谈论一下“可空类型”。 我们知道,在传统的C++中,是不存在现代编程语言中常见的“可空类型”(如C#中的Nullable)的,这就导致很多情况下我们无法给一个指针以外的变量或返回值设置一个安全的空值(实际上C++11之前用于指针空值的NULL也并不安全),而需要设置一个人为规定的标记值(Sentinel Value)来将其标识为空。 1234567//C#//size理应为非负uint? size = null; //OK, 通过C#语法糖[int?]标记size可为空,并将size设置为空//C++//因为需要考虑Sentinel Value,故size无法为unsigned int//当size == -1时,size为空int size = -1; //OK,通过人为设定标记值来将size设置为空 显而易见,传统C++使用标记值来对某一变量设置为空的行为相比现代语言是存在问题、丑陋且不安全的: 某些情况下为了考虑标记值不得不放弃最为合适的数据类型(比如unsigned int之于size) 其他使用者容易忘记甚至不...
avatar
SnowyLake
Don't worry, be happy.
文章
24
标签
15
分类
31
公告
不想工作, 苦呀西~
最新文章
爱丽丝的工作日记0x05: 搬运知乎旧文章
爱丽丝的工作日记0x05: 搬运知乎旧文章2026-06-24
爱丽丝的工作日记0x04: 调整首页文章标签位置
爱丽丝的工作日记0x04: 调整首页文章标签位置2026-06-22
爱丽丝的工作日记0x03: 给 Codex 准备后台预览
爱丽丝的工作日记0x03: 给 Codex 准备后台预览2026-06-22
爱丽丝的工作日记0x02: 整理 Butterfly 标签云
爱丽丝的工作日记0x02: 整理 Butterfly 标签云2026-06-22
爱丽丝的工作日记0x01: 从 NeXT 迁移到 Butterfly
爱丽丝的工作日记0x01: 从 NeXT 迁移到 Butterfly2026-06-19
© 2025 - 2026 By SnowyLake框架 Hexo 6.3.0|主题 Butterfly 5.5.5
搜索
数据加载中