启发式算法
摘要:启发式算法在有限资源下寻找优化问题的可行解,不保证最优但快速有效。典型算法包括模拟退火(概率性跳出局部最优)和遗传算法(模拟自然选择进化)。适用于NP难问题如TSP,平衡计算成本与解质量。
Intro
首先考虑一个经典问题:旅行商问题(Traveling Salesman Problem, TSP).
或许你的第一想法式dijastra算法.但问题在于dijastra解决的是点到点的最短路径,而旅行商要转一圈回到原点,这是dijastra算法无法解决的问题.
或许你还会想到贪心算法.事实上,贪心算法正是启发式算法的一个子类.但是在这个问题中,什么贪心策略都无法保证全局最优解.
为什么我能这么肯定呢?因为旅行商问题是一个NP难(NP−hard)NP难(NP-hard)NP难(NP−hard)问题,要想得到最优解,就必须把所有可能枚举出来然后再做比较.
如果你能做到不枚举所有可能就得到最优解,那么今年的菲尔兹奖,图灵奖等等等等你肯定是要拿到手软了.
我们继续分析旅行商问题.如果有nnn个城市,则路径有(n−1)!(n-1)!(n−1)!种可能,显然当n变大时,计算量就要爆炸 ...
Unity Render Graph 系统介绍
摘要:Unity Render Graph系统通过DAG管理渲染流程,采用资源句柄间接访问,动态分配/释放资源,自动处理Pass间依赖与同步。其三大执行阶段(Setup、Compilation、Execution)实现高效渲染管线,提升内存利用率与可维护性。
Render Graph 是现代渲染引擎的一个中间层,下接RHI层,上接渲染管线.
为什么使用Render Graph
传统渲染管线背景:
Render Graph 优势:
高效内存管理,只分配实际使用的资源 -一个pass的资源
自动处理同步点 -graph可以处理pass之间依赖
可维护性高 -pass高内聚,低耦合
名词
Render Graph: 渲染图,管理 Pass DAG
Pass: 一个完成的渲染过程,是Render Graph 的一个节点
主要原则
Resource Haldles:
你无法直接处理资源,而是通过Handle来间接处理,如RTHandles,ComputeBuffers,RendererLists
资源访问限制:
你只被允许在 Render Pass 的 Execution 中 ...
Early-Z and Pre-Z -- 介绍与区别
摘要:Early-Z和Pre-Z都是优化深度测试的技术。Early-Z在片元着色前进行深度测试减少OverDraw,但需要CPU排序且不支持透明物体。Pre-Z采用双pass渲染,首pass建立深度缓冲,次pass着色,解决了排序问题但增加Draw Call。两者各有利弊,需根据场景选择。
Depth Testing 深度测试
在介绍Early-Z和Pre-Z之前,我们首先得了解深度测试.
深度测试是用于解决物体可见性问题(是否被遮挡)的技术.在渲染管线中位于片元着色器之后
但是深度测试会带来一个问题:
即有的片元在经历了着色后,在深度测试环节被直接抛弃了,这显然是对算力的浪费–我们完全可以不用计算这些片元.
我们把这一问题称为OverDraw问题.
Early-Z就是这个问题的一种解决方案.
Early-Z
Early-Z是在光栅化之后,片元着色器之前增加的一步操作
在这一流程中,会进行一次深度测试,剔除掉所有不通过的片元,这样就减少了算力 的浪费.
读者可能会想,如果提前进行了深度测试,那最后不就不需要再进行深度测试了吗?
事实上,由于渲染管线的复杂性,我们需要再最后 ...
NeRF介绍
摘要:NeRF(神经辐射场)是一种基于深度学习的三维重建技术,通过隐式建模场景的神经辐射场,直接从多视角图片学习连续5D坐标到颜色和密度的映射。它简化了传统重建流程,利用体渲染合成新视图,有效处理复杂材质和半透明物体,但缺乏场景编辑能力。
NeRF介绍
前言
NeRF(Nerual Radiance Field):神经辐射场,是在2020年被提出的一种三维重建技术。由于其对比传统三维重建技术来说有简单快速且效果好的优势,尤其是解决了传统三维重建难以处理的反射表面和烟雾等半透明物体,以至于迅速爆火甚至“出圈”。
三维重建
我们经常会听到“渲染”一词,这是一个将计算机中存储的各种数据(Mesh,材质,光照等)通过一定的流程从而得到一张图片。而三维重建可以认为是这一过程的逆过程,即通过已有的图片,来还原一个三维的场景。
传统的三维重建技术一般有四个步骤:
SfM(运动恢复结构)
该步骤接受图像和摄像机内外参数作为输入,输出一个三维的稀疏点云
MVS(多视立体视觉)
该步骤将前一步的稀疏点云进行稠密化,进而输出稠密的三维点云
表面重建
根据三维点云计算出三角网格
纹理重建
通过输入图 ...
【TroubleShooting】git提示文件过大
摘要:Git提交文件过大时,可通过.gitignore忽略文件、删除历史大文件或使用git-lfs扩展管理大文件。核心是绕过Git默认100MB限制,其中git-lfs能有效跟踪大文件。
问题描述
在使用git提交代码时,提示文件过大,无法提交。
问题原因
git的默认配置下,文件大小限制为100MB。如果文件超过100MB,则无法提交。
如果某次commit中包含大文件,即使在后续的commit中删除了大文件,也需要上传大文件,导致commit失败。
解决方法
1. 忽略大文件
在项目根目录下创建一个.gitignore文件,并添加需要忽略的文件或目录,如:
*.log
*.zip
2. 在commit中删除大文件
使用git log 命令查看提交记录,找到超过大小的文件所在的提交
使用git reset 命令回退到指定提交
重新提交
上传
3. 使用git-lfs
git-lfs是一个开源的Git扩展,可以跟踪大文件,并将它们存储在Git的对象数据库中,而不是像Git本身一样直接跟踪它们。
安装git-lfs:
sudo apt-get install git- ...
C++ - STL的神奇用法
元素去重
set
示例:
vector<int> nums = {1, 2, 3, 2, 1, 4, 5, 4, 6};
set<int> s(nums.begin(), nums.end());
nums.assign(s.begin(), s.end());
原理:
set(集合)–每个元素只出现一次,且元素有序(默认升序).
将vector中的元素赋值给set,得到一个元素唯一的集合.
将set中的元素赋值给vector,得到一个元素唯一且有序的vector.
消耗:
时间复杂度: O(n log n)
空间复杂度: O(n)
二分查找
lower_bound()
示例:
vector<int> nums = {1, 3, 5, 7, 9};
int pos = lower_bound(nums.begin(), nums.end(), 5) - nums.begin();
cout << "The position of 5 is " << pos << end ...
ClearCoat从理论到实践
摘要:本文解析glTF清漆层(ClearCoat)技术实现,涵盖参数配置、BRDF分层模型及菲涅尔混合计算,重点阐述强度/粗糙度因子与纹理的线性叠加方式,以及清漆层与基础材质的微表面BRDF合成原理。
本文为这篇文章的翻译与整理
清漆层(Clearcoat)
类型
描述
必需
clearcoatFactor
清漆层强度。
否,默认值:0.0
clearcoatTexture
清漆层强度纹理。
否
clearcoatRoughnessFactor
清漆层粗糙度。
否,默认值:0.0
clearcoatRoughnessTexture
清漆层粗糙度纹理。
否
clearcoatNormalTexture
清漆层法线贴图纹理。
否
如果clearcoatFactor为零,整个清漆层将被禁用。
值计算
清漆层强度和粗糙度可以使用因子、纹理或两者来定义。
如果未提供clearcoatTexture或clearcoatRoughnessTexture,则假设其纹理分量的值为1.0。
所有清漆层纹理在线性空间中包含RGB分量。
如果同时存在因子和 ...
静态批处理 & 动态批处理 & GPU Instancing
摘要:本文介绍了三种优化DrawCall的技术:静态批处理通过合并相同材质的静态网格减少DrawCall;动态批处理在运行时合并小型动态物体;GPU Instancing则利用实例化渲染大量相同物体。三种技术各有适用场景,都能有效提升渲染性能。
Intro
我们知道,在传统的渲染管线中,为了渲染一个物体,CPU需要向GPU发送一个DrawCall命令.
比如下面这段代码:
glDrawElements(GL_TRIANGLES, indices->size(), GL_UNSIGNED_INT, 0);
而在下达DarwCall命令之前,CPU还需要设置好渲染状态,绑定顶点数据,绑定纹理,设置材质等等.比如这样:
glBindVertexArray(VAO); // 设置VAO
material->Use(); // 设置材质
status->Set() // 设置物体各种状态
//...
glDrawElements(GL_TRIANGLES, indices->size(), GL_UNSIGNED_INT, 0);//DrawCall
值得注意的是,设置各种参数的操作费用不 ...
Irridescence从理论到实践
摘要:本文解析基于薄膜干涉的彩虹色渲染技术,详细介绍了KHR_materials_iridescence扩展的参数体系(厚度、折射率)及实现原理,包括BRDF模型在金属/电介质材质上的具体应用方法。
本文为这篇文章的翻译与整理
彩虹色(Iridescence)
彩虹色描述了一种色调随观察角和光照角变化的效果。
半透明层的薄膜产生相互反射,由于薄膜干涉,某些波长被吸收或放大。
例子包括肥皂泡、油膜和昆虫翅膀。
此扩展允许指定薄膜的厚度和折射率(IOR),实现彩虹色材质。
属性
类型
描述
必需
iridescenceFactor
彩虹色强度因子。
否,默认值:0.0
iridescenceTexture
彩虹色强度纹理。
否
iridescenceIor
薄膜层的折射率。
否,默认值:1.3
iridescenceThicknessMinimum
最小薄膜厚度(纳米)。
否,默认值:100.0
iridescenceThicknessMaximum
最大薄膜厚度(纳米)。
否,默认值:400.0
iridescenceThickness ...
[读书笔记] 函数式编程 - 第七章 函子与单子
第七章 函子与单子
函子(Functor) :对容器中的值(Map)
应用函子(Applicative Functor) :将包裹在容器中的函数(Apply)包裹在容器中的值
单子(Monad) :链式操作
函子
一个函数,输入输出类型相同的函数
函子需要遵从的定律
恒等律
相同输出->相同输出
结合律
组合两个函子map box = 两个函子分别map box
函子的好处
错误处理
链式操作
好看
鲁棒
应用函子(Applicative Functors)
四大定律
同态律(Homomorphism law)
交换律(Interchange law)
组合律
同态律
pure(x).map(f)=pure(f(x))pure(x).map(f)=pure(f(x))
pure(x).map(f)=pure(f(x))
交换律
pure(x).apply(pure(f))=pure(f(x))pure(x).apply(pure(f))=pure(f(x))
pure(x).apply(pure(f))=pure(f(x))
结合律
...
