学习 UE Lumen:动态全局光照的实现原理(概览)
0. Lumen 在解决什么问题Lumen 是虚幻引擎 5 中的动态全局光照(GI)与反射方案,目标是在可交互帧率下,让间接光、天空光、自发光与反射随场景与光源变化而更新,而不依赖预烘焙 Lightmap。 和离线烘焙相比,它的代价是:近似、有噪声、有分辨率与距离上的折中;和纯路径追踪相比,它的特点是:高度工程化——用多种加速结构与缓存把“多反弹光照”压进毫秒级预算。 1. 整体心智模型:不是一条管线名字,而是一套系统可以把 Lumen 理解成三层协作: 场景表示(Scene Representation) 用距离场、高度场、表面缓存等近似几何与材质,供光线/锥体查询“往哪走、打到什么颜色”。 光照求解(Lighting Solve / Gather) 在屏幕空间与 world space 里做最终汇聚(Final Gather)、**辐射缓存(Radiance Cache)**等,把多 bounce 的间接光折合成可采样的结果。 与主渲染整合 ...
学习图形学:光线追踪入门(从 0 到可用的最小实现)
0. 为什么要学光线追踪光线追踪(Ray Tracing)的价值不只是“更真实”,而是它把渲染问题拆成一套非常统一的数学与工程模块:发射射线 → 求交 → 计算散射/发光 → 继续追踪/结束。理解这套闭环后,再回头看光栅化管线、PBR、GI、采样与降噪,会更容易形成体系。 本文目标:做出一个能渲染球体/三角形、支持阴影、反射,并能逐步扩展到路径追踪的最小实现。 1. 你需要的最小数学与约定 向量:点乘(投影/夹角)、叉乘(法线/面积)、归一化 射线: r(t) = o + t d ,其中 t > 0 坐标系:右手/左手都行,但要一致(相机、法线方向、叉乘方向) EPS:为避免自相交,常用一个很小的偏移量 \epsilon (如 1e{-4}) 2. 关键模块总览(建议按这个顺序实现) 2.1 相机(Camera):把像素坐标映射到世界空间射线 2.2 几何(Hittable):射线-物体求交(球体最容易起步) 2.3 材质(Material /...
Try on 个人衣柜
AI 试穿 + 个人衣柜,让一次性试穿体验沉淀为可持续复用的数字穿搭资产。 Try on 个人衣柜 是一款面向线上穿搭决策的 AI 应用。它不仅提供虚拟试穿,还把用户上传或生成的服装沉淀为结构化衣橱数据,进一步支持分类管理、每日推荐和后续复用。相比单次试穿工具,它更接近一个持续增长的个人穿搭系统。 项目概览 官网:theafitroom.com 核心定位:AI 试穿 + 个人衣柜 + 穿搭推荐 技术栈:React 19 + TypeScript + Tailwind CSS + Cloudflare Workers + D1 + R2 + Gemini / Vertex AI 产品状态:已商业化运营 适用场景:线上购物、穿搭预览、衣橱整理 核心功能1. 智能虚拟试穿上传人物照片与服装图片后,系统会发起异步试穿任务,完成服装替换、光影融合和结果评估,生成接近真实上身效果的试穿预览。 2. 服装上传与自动入柜服装图片除了用于试穿,也可以进入个人衣柜。系统会自动识别品类并提取结构化标签,例如颜色、季节、层级和适用场景,方便后续检索和推荐。 3....
基于 URP 的 LDR 局部边缘泛光方案 (Selective Edge Bloom)
1. 概述 (Overview)本方案旨在 Unity Universal Render Pipeline (URP) 环境下,实现一种不依赖高动态范围(HDR)与全局后处理的局部边缘泛光效果。特别适用于需要保留模型本身贴图细节、仅在物体边缘产生溢色光晕,且严格要求物理遮挡关系正确的场景(如复杂的室内环境、角色背着发光武器等)。 1.1 解决的核心痛点 绕过 LDR 限制:无需全屏亮度阈值提取 保护材质细节:利用反向遮罩剔除中心过曝,保留模型原有光照 解决透视穿模(X-Ray 穿透):通过复用主相机深度缓冲(Depth Buffer),确保发光体在被其他物体遮挡时,光晕表现符合物理逻辑 2. 渲染管线架构 (Pipeline Architecture)本方案通过自定义 URP ScriptableRendererFeature 注入三个核心 Render Pass: Pass 注入时机 职责 Mask Pass AfterRenderingOpaques 提取目标物体遮罩 Blur...
游戏优化与设计模式(19):ECS 框架详解
原视频:https://www.bilibili.com/video/BV1XTxuzfEB9/ 标题:【游戏优化与设计模式】19 ECS框架详解 为什么游戏项目会转向 ECS在传统面向对象写法里,一个角色类里往往同时包含移动、渲染、碰撞、AI、音效等逻辑。项目前期开发速度快,但随着功能增长,类会越来越“胖”,耦合增加,修改一个功能可能牵动多个模块。 ECS 的核心目标就是把“数据”和“行为”拆开: Entity(实体)只负责身份标识。 Component(组件)只存数据,不写业务逻辑。 System(系统)只处理一类逻辑,对满足条件的实体批量执行。 这套拆分方式能显著提升可维护性,同时让底层数据更容易做连续存储,对 CPU 缓存更友好。 ECS 三要素怎么理解Entity:轻量 IDEntity 可以理解成一个整数 ID。它本身不包含业务信息,只是把不同组件关联起来。 例如玩家实体 Entity#1001...
AI 时代的电商转型
一个核心变化过去电商买衣服,主路径是: 用户打开 App 或网页。 用户自己搜索、筛选、对比。 商家通过投流、关键词和活动位争夺曝光。 AI Agent 出现后,入口开始变化: 用户先告诉 Agent 需求(预算、尺码、风格、场景)。 Agent 去多平台检索、比价、过滤。 Agent 只把少量“候选结果”返回给用户。 这意味着,商家不再只是“面向人类页面”,而是必须“面向 Agent 决策”。 旧电商逻辑:买流量传统玩法的核心是曝光竞争: 买广告位和关键词。 做点击率、停留时长、转化漏斗。 依赖平台推荐算法博弈流量。 这套逻辑的前提是:用户大部分时间停留在平台页面里。 新电商逻辑:给 Agent 数据当 Agent 成为主要入口,商家需要投入的重点会转向“可被机器理解和调用”: 商品属性结构化:材质、版型、厚度、季节、适配人群、退换规则。 库存和价格实时化:避免 Agent 选到失效商品。 尺码与版型标准化:让 Agent 能做跨品牌推荐。 售后与履约能力可读:发货时效、运费、逆向物流、客服 SLA。 一句话:从“页面好看”转向“数据可用”。 对 Agent...
UE5.6 多人游戏插件开发
1. 创建插件1 .1 UE编辑器中创建1. 2 插件设置依赖项2. 插件中创建会话1. 创建会话类的父类(使用Subsystem)插件保证通用性。通过访问Game Instance Subsystem class 来获取当前游戏的Game Instance的内容 知识点1. UE中的编程子系统子系统是具有托管生命周期的自动实例化类,为程序员提供易用的扩展点,可避免修改或重写引擎类的复杂性,同时能让蓝图(Blueprint)和 Python 直接访问。目前支持的子系统生命周期类型包括引擎、编辑器、游戏实例、本地玩家等。使用子系统有诸多好处,如节省编程时间、避免重写引擎类、避免在已有大量功能的类上添加更多 API 等,在创建插件时尤其有用。子系统可通过蓝图和 Python 访问,蓝图中自动暴露且有智能节点,Python...
Unreal Engine 5 C++ Multiplayer Shooter
42. Network Role本文主要介绍了虚幻引擎中多玩家游戏中角色的网络角色(role),包括本地角色(local role)与远程角色(remote role),以及它们在多机环境中的不同应用。作者通过创建一个悬浮角色状态显示Widget,详细讲解了服务器端(authority)、自主代理(autonomous proxy)和模拟代理(simulated proxy)等概念,帮助开发者理解不同角色在网络中的表现,从而实现角色状态的可视化和判别。 重点总结虚幻引擎中定义了角色的网络角色(Net Role),用于区分角色在不同机器上的状态。角色的角色状态主要分为:权限(Authority)、自主代理(Autonomous Proxy)、模拟代理(Simulated Proxy)和无角色(None)。服务器端的角色一般为角色权限(Authority),而客户端控制的角色为自主代理(Autonomous Proxy)。其他客户端或非控制角色在本机显示为模拟代理(Simulated...
C++多线程
Mutex 线程锁避免 C++ 多线程对同一数据写入和读取产生的错误。 1. 锁 std::mutex 创建 std::mutex mtx 对象,用 mtx.lock() 上锁,mtx.unlock() 解锁。 12345678910111213141516171819202122232425262728#include <iostream>#include <thread>#include <vector>#include <mutex>#include <chrono>#include <stdexcept>int counter = 0;std::mutex mtx; // 保护countervoid increase(int time) { for (int i = 0; i < time; i++) { mtx.lock(); // 当前线程休眠1毫秒 ...
线程池与 Job System
C++ 最小线程池实现下面是一个简洁易懂的 C++11 线程池最小实现示例,并附详细注释: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include <vector> // 用于存储线程对象#include <queue> // 任务队列#include <thread> // std::thread#include <mutex> // std::mutex#include <condition_variable> // 条件变量用于线程同步#include <functional> // std::function 封装任务#include <future> ...
