SA-GS复现
SA-GS部署及训练过程SA-GS,无需训练,直接鲁棒提升3D高斯抗锯齿能力 介绍3DGS以其高质量的视图渲染和快速的速度而受到业界的关注。但是,渲染过程中可能会发生视图质量下降,具体取决于分辨率、距离和焦距等设置。现有方法通过在训练期间向 3D 和 2D 空间中的高斯基元添加规律性来解决这个问题。然而,这些方法忽略了 3DGS 在与不同渲染设置一起使用时的一个显着缺点:比例模糊问题。这个问题直接导致 3DGS 无法利用传统的抗锯齿技术。我们首次提出并分析了这个问题,并仅使用二维尺度自适应滤波器来纠正这一缺点。基于此,我们采用积分、超级采样等常规抗混叠方法来解决采样频率不足导致的混叠效应。值得注意的是,我们的方法是第一个不需要训练的高斯抗锯齿技术。因此,它可以直接集成到现有的3DGS模型中,以增强其抗锯齿能力。该方法在有界和无界场景下都得到了验证,实验结果表明,该方法以最有效的方式实现了稳健的抗锯齿性能增强,超过或等于当前的最优设置。 代码拉取和部署1git clone https://github.com/zsy1987/SA-GS.git 123456cd SA-GScon...
球谐函数
这几天老子出奇的忙啊,档期满了,停更一周 球谐函数 基本概念球谐函数基础球谐函数(Spherical Harmonics, SH) 是定义在单位球面上的正交函数集,广泛用于物理学、计算机图形学(如全局光照、环境光遮蔽)、量子力学等领域。其核心特性包括: 正交性:不同阶的 SH 基函数在球面积分下正交。 旋转不变性:SH 系数在旋转后可以高效重建。 低频信号压缩:低阶 SH 可有效表示平滑信号。 数学定义球谐函数由 伴随勒让德多项式(Associated Legendre Polynomials) 和复指数函数组合而成,通常表示为: $$Y_l^m(\theta, \phi) = \sqrt{\frac{(2l+1)(l-m)!}{4\pi(l+m)!}} P_l^m(\cos\theta) e^{im\phi}其中:$$ ( l ) 是阶数(非负整数),( m ) 是次数($$ -l \leq m \leq l$$)。 ( \theta ) 是极角(天顶角),( \phi ) 是方位角。 ($$P_l^m$$ ) 是伴随勒让德多项式。 在计算机图形学中,...
DeferredGS 和 3DGS-DR技术对比
DeferredGS 和 3DGS-DR技术对比对比简介这两篇论文(DeferredGS 和 3DGS-DR)都致力于将延迟渲染(Deferred Shading) 技术引入 3D Gaussian Splatting (3DGS) 框架,以解决传统 3DGS 在处理高光反射(Specular Reflection) 时的核心问题。然而,它们在目标、技术实现、核心贡献和应用场景上存在显著差异。 以下是对两篇论文相同点与不同点的详细分析: 相同之处 (Key Similarities) 核心技术:延迟渲染 (Deferred Shading): 两篇论文都摒弃了 3DGS 原始的前向着色 (Forward Shading) 方式(即在每个 Gaussian 上计算颜色然后混合)。 都采用了两阶段渲染管线: 阶段 1 (Gaussian Splatting Pass): 将 Gaussian 的属性(位置、法线、材质参数等)光栅化到屏幕空间的缓冲(G-Buffer)中。 阶段 2 (Shading Pass): 在像素级别,利用 G-Buffer 中的信息(法线、材质等)和光照信...
C++核心语言特性
C++核⼼语⾔特性基础语法与概念 指针占用内存,为什么引用不一定占用内存这是一个非常经典、但又容易混淆的问题。我们来一步步拆解: ✅ 一句话结论: 指针是一个变量,必须占用内存;而引用是别名,编译器在大多数情况下会把它优化为直接访问对象本身,因此不一定占用内存。 🔍 详细解释:1. 指针是一个变量 指针本身是一个独立的变量,存储的是另一个对象的地址。 既然它是一个变量,那它就必须占用内存(通常是 4 字节或 8 字节,取决于平台)。 12int a = 10;int* p = &a; // p 是一个变量,占用内存,存储的是 a 的地址 2. 引用是别名,不是变量 引用在语义上是某个对象的别名,编译器在编译阶段会把它解析为原始对象本身。 在大多数情况下,编译器会优化掉引用,不会为它分配额外内存。 12int a = 10;int& r = a; // r 是 a 的别名,编译器通常会直接替换成 a 本身 🧠 举个例子(汇编层面):指针版本:123int a = 10;int* p = &a;*p = 20; 汇编(简化): 1...
3DGS-DR部署及训练教程
3DGS-DR部署及训练教程 项目介绍 paper:3D Gaussian Splatting with Deferred Reflection web:3D Gaussian Splatting with Deferred Reflection github:https://github.com/gapszju/3DGS-DR.git 摘要:神经与高斯基辐射场方法的兴起在新视角合成领域取得了巨大成功。然而,镜面反射仍然是一个非平凡的问题,因为高频辐射场 notoriously 难以稳定且准确地拟合。我们提出了一种延迟着色方法,能够有效地利用高斯溅射渲染镜面反射。关键挑战来自于环境贴图反射模型,该模型需要精确的表面法线,同时其不连续的梯度又成为法线估计的瓶颈。我们利用延迟着色生成的逐像素反射梯度,在相邻高斯的优化过程之间架起桥梁,使得近乎正确的法线估计能够逐步传播,最终覆盖所有反射物体。我们的方法在合成高质量镜面反射效果方面显著优于现有最先进技术和同期工作,在合成场景与真实场景中均实现了峰值信噪比(PSNR)的持续提升,同时运行帧率几乎与原始高斯溅射相同。 项目部署...
设计模式的原则
设计模式的原则设计模式的原则是面向对象设计的指导思想,它们为我们提供了设计高质量、可维护、可扩展软件系统的基本准则。这些原则是设计模式背后的理论基础。 SOLID 原则SOLID 是五个重要设计原则的首字母缩写,由 Robert C. Martin 提出。 1. 单一职责原则 (Single Responsibility Principle - SRP)定义:一个类应该只有一个引起变化的原因。 解释: 每个类应该只负责一个特定的功能或职责 避免创建”万能类”,这样的类难以维护和测试 将不同的职责分离到不同的类中 示例: 1234567891011121314151617181920212223// 违反SRP的示例class Employee {public: void calculateSalary() { /* 计算工资 */ } void saveToDatabase() { /* 保存到数据库 */ } void generateReport() { /* 生成报告 */ }...
简单工厂模式
简单工厂模式讲解(C++实现)前期问题引入假设我们正在开发一个电子产品商店系统,需要创建不同类型的电子产品对象,如手机、平板电脑和笔记本电脑。在没有使用设计模式的情况下,我们可能会这样写代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include <iostream>#include <string>using namespace std;// 电子产品类型enum ProductType { PHONE, TABLET, LAPTOP};// 手机类class Phone {public: void showInfo() { cout << "这是一部手机" << endl; }};// 平板电脑类class Tablet ...
策略模式
策略模式策略模式是什么策略模式(Strategy Pattern)是一种 行为型 设计模式,核心思想是: 把“一组可互相替换的算法”封装成独立类,让它们实现同一个接口,运行时按需切换,而不用修改客户端代码。 一、生活例子 10 秒懂 去机场有 3 种算法:地铁、大巴、打车。 算法各自封装成类(MetroStrategy、BusStrategy、TaxiStrategy)。 你手里只拿一张“去机场”的通用票(Context),想省钱就插地铁算法,想快就插打车算法——切换即插即用。 二、代码骨架(语言无关) 1234567891011121314151617181920 ┌----------------┐ │ Strategy接口 │◀----┐ │ +algorithm() │ │ └----------------┘ │ 实现 △ │ ...
偏我来时不逢春,偏我走时春又来
偏我来时不逢春,偏我走时春又来@乐与怒: 一个人很难在青春的时候享受青春,很难在经历美好的时候知道这是美好,所以,人的一生写满了遗憾,有的时候出场顺序真的很重要,很多人如果换个时间认识,可能故事的结局就会完全不同,生不逢时,爱不逢人,所到之处,皆是命数。
生产者消费者模型
生产者消费者模型我第一次写的代码1234567891011121314151617181920212223242526272829303132333435363738394041424344#include<iostream>#include<queue>#include<thread>#include<mutex>#include<condition_variable>std::queue<int> g_queue;std::mutex g_mutex;std::condition_variable g_cv;void producer() { for (int i = 0; i <= 10000; i++) { std::unique_lock<std::mutex> lk(g_mutex); g_queue.push(i); std::cout << "producer:" << i << std::en...









