图形渲染中的透明混合
现代 GPU 默认采用的是经典的 Source Over 混合公式。设当前绘制颜色Source为Cs透明度为αs。帧缓冲已有颜色Destination为Cd, 透明度为αd。那么混合后的颜色为CoutαsCs(1−αs)Cd(28)对应透明度为αoutαs(1−αs)αd(29)GPU 中对应的 OpenGL 设置通常就是glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);Unity、Unreal、Vulkan、DirectX 等现代图形 API 本质上都是这一套公式。从上述公式可以看出Alpha Blending 是不满足交换律的两个透明的物体谁前谁后对最终混合的颜色影响巨大。因此透明物体的渲染队列必须遵循由远到近的顺序这就说经典的画家算法Painter’s Algorithm。它的思想非常符合现实像画画一样先画远处再画近处。3DGS中的透明混合3DGS 的透明混合与传统 GPU 几乎完全一致。区别仅在于传统图形学混合的是三角形片元Fragment而 3DGS 混合的是二维高斯椭圆Gaussian Splat。设第 (i) 个高斯在当前像素上的透明度为αi颜色为ci若所有高斯已经按照深度完成排序则最终颜色可写成CN∑i1Tiαici(30)其中:Tii−1∏j1(1−αj)(31)表示第 (i) 个高斯之前剩余的透射率Transmittance。这个公式与传统 Alpha Blending 完全一致只不过将 GPU 固定功能中的混合操作显式写成了数学递推。具体的含义可以这样理解最终颜色 每一个高斯球的颜色贡献 × 它前面所有高斯球的累积透明度然后把所有高斯球的贡献加起来。图形渲染实现从数学角度来看3DGS 并没有发明一种新的透明混合算法。与传统图形渲染最大的区别在于透明度的来源不同。在 3DGS 中每一个二维高斯都会根据高斯函数实时计算当前像素的透明度αα0exp(−12d2)(32)其中α0为训练得到的不透明度参数(d) 为当前像素到高斯中心的马氏距离。因此高斯自身天然就是一个连续变化的半透明体而无需依赖额外的 Alpha 纹理。从工程实现来看这种做法也带来了新的挑战。传统渲染管线依赖 GPU 固定功能完成透明混合而 3DGS 通常需要自行控制高斯排序、颜色累积以及透射率计算因此很难直接融入已有的 Forward 或 Deferred 渲染流程。对于需要与传统三角形场景共同渲染的应用如 AR、数字孪生、游戏引擎等一种较为合理的方案是在现有渲染管线中增加连续后处理Post Process或自定义渲染队列Custom Render Queue将 3DGS 作为独立的透明渲染阶段与传统光栅化渲染协同工作而不是完全替代现有的图形流水线。实现伪代码在常规 GPU 图形渲染中我们无法像 CPU 那样简单地用一个变量去循环累加颜色。因此3DGS 需要借助额外的纹理来在像素之间传递混合状态。通常我们会引入两张关键的纹理作为额外的渲染目标累积颜色纹理Accumulated Color Texture存储公式 (30) 中的最终颜色C。累积透射率纹理Accumulated Transmittance Texture存储公式 (31) 中的剩余透射率T初始值为 1.0。以下是 3DGS 渲染单个高斯椭球时的片元着色器Fragment Shader核心伪代码// 片元着色器伪代码// 输入uniform sampler2D accumulated_color_tex; // 累积颜色纹理uniform sampler2D accumulated_transmittance_tex; // 累积透射率纹理in vec2 screen_uv; // 当前像素的屏幕坐标in vec3 gaussian_color; // 当前高斯的颜色 c_iin float gaussian_alpha; // 当前高斯在当前像素的透明度 α_ivoid main() {// 1. 读取当前像素之前的累积状态vec3 C_accum texture(accumulated_color_tex, screen_uv).rgb;float T_accum texture(accumulated_transmittance_tex, screen_uv).r;// 2. 计算当前高斯的贡献 // 当前高斯的颜色贡献 自身颜色 * 自身透明度 * 之前所有高斯的累积透射率 vec3 contribution gaussian_color * gaussian_alpha * T_accum; // 3. 更新累积颜色 vec3 C_new C_accum contribution; // 4. 更新累积透射率 // 新的透射率 旧的透射率 * (1 - 当前高斯的透明度) float T_new T_accum * (1.0 - gaussian_alpha); // 5. 将新的状态写回纹理供下一个高斯读取 // 注意实际工程中是写出到绑定的渲染目标 imageStore(accumulated_color_image, pixel_coord, vec4(C_new, 1.0)); imageStore(accumulated_transmittance_image, pixel_coord, T_new);}在这段伪代码实现中关键在于以下两点计算贡献根据公式 (30) 和 (31)当前高斯对最终颜色的贡献是 gaussian_color * gaussian_alpha * T_accum。这里的 T_accum 完美对应了公式中的∏i−1j1(1−αj)。累加与更新将贡献值加到Caccum上并将Taccum乘以(1−αi)得到新的透射率。八、深度排序上一节介绍了过 3DGS 的透明混合公式成立的前提是所有 Gaussian 必须按照距离摄像机由远到近Back-To-Front完成排序。否则由于 Alpha Blending 不满足交换律会出现透明颜色错误、遮挡关系异常等问题。排序依据一个 Gaussian 本身是一个三维椭球而不是一个点那么它究竟按照什么深度排序原版的 3DGS 没有考虑那么复杂仅使用 Gaussian 中心在相机空间中的深度作为排序依据。设高斯中心为μ(x,y,z), 经过视图变换后得到相机空间坐标μc(xc,yc,zc)。排序使用的深度就是Depthzc(33)按照 Depth 从远到近Back-To-Front排序。伪代码如下for (Gaussian g){vec3 centerView ViewMatrix * g.mean;g.depth centerView.z;}Sort(depth);也就是说一个 Gaussian 是否排在前面与它的协方差矩阵、椭球长短轴以及屏幕覆盖面积均无关系而仅取决于它中心点距离摄像机的远近。从理论上来说仅使用中心点排序确实不是完全准确但这种误差通常不会十分明显不会影响最终渲染效果是精度与效率之间的一种工程折中。全局排序明确了排序依据那么是不是对所有 Gaussian 按照深度排序再依次进行透明混合就可以了呢我们知道一般比较好的排序算法复杂度是O(NlogN)这对于百万级甚至千万级 Gaussian 来说开销十分巨大。更重要的是由于摄像机可以自由移动每一帧所有 Gaussian 到摄像机的距离都会发生变化因此排序结果也必须实时更新。如果采用传统 CPU 排序Camera Move↓CPU Sort↓Upload GPU↓Render不仅排序耗时巨大还会产生大量 CPU 与 GPU 之间的数据传输几乎无法满足实时渲染需求。Tile-Based Rendering原版的 3DGS 借鉴了现代 GPU 的 Tile-Based Rendering 思想。将屏幕划分为固定大小的小块Tile例如±—±—±—| T0 | T1 | T2 |±—±—±—| T3 | T4 | T5 |±—±—±—| T6 | T7 | T8 |±—±—±—通常每个 Tile 为 16 × 16 像素。随后每个 Gaussian 根据自己的二维包围盒被分配到它覆盖到的所有 Tile。例如Gaussian A┌────────┐│ │±—±—±—| T0 | T1 | T2 |±—±—±—| T3 | T4 | T5 |±—±—±—Gaussian A 同时覆盖T1、T2、T4 和 T5。因此只需要加入这些 Tile 的渲染列表即可而无需参与整个屏幕的排序。局部排序完成 Tile 划分之后每一个 Tile 都维护自己的 Gaussian 列表Tile 0Gaussian 15Gaussian 28Gaussian 91Gaussian 302…随后仅在当前 Tile 内按照深度排序Far↓Gaussian302Gaussian91Gaussian28Gaussian15Near最后由 GPU 对 Tile 内所有 Gaussian 完成透明混合。由于每个 Tile 覆盖的 Gaussian 数量通常只有几十到几百个因此排序成本相比全局排序大幅降低。整个渲染流程可以表示为Gaussian│ ▼Screen Projection│ ▼Assign Tile│ ▼Sort Inside Tile│ ▼Alpha Blending可以看到真正参与排序的不再是整个场景而只是每一个 Tile 内部的 Gaussian。图形实现以上是原版 3DGS 使用 CUDA 进行高效排序的实现思路。那么如果想在现代图形引擎中实现同样的效果该怎么做呢答案是可能并不太容易实现至少没有形成工程上的最优解。虽然现代 GPU 的算力非常强大但在 GPU 中进行高效的全局或局部排序本身就不是一件容易的事情。传统的图形渲染管线并没有提供现成的“排序”指令。一种可行的工程思路是利用计算着色器Compute Shader来复用上述的 Tile-Based 排序逻辑。具体流程可能如下投影与分配在 Compute Shader 中首先将所有 3D 高斯投影到 2D 屏幕空间并计算它们覆盖了哪些 Tile生成 (Tile ID, Depth, Gaussian ID) 的列表。GPU 排序在 Compute Shader 中实现或调用一个高效的并行排序算法如 GPU 版本的 Radix Sort 或 Bitonic Sort对这个列表进行排序。光栅化与混合排序完成后再将排序好的高斯列表传递给后续的渲染阶段可能是另一个 Compute Shader 或传统的片元着色器按照 Tile 顺序进行透明混合。因此尽管 3DGS 的渲染质量极高但其在通用图形引擎中的集成门槛很大程度上就卡在了这个“GPU 排序”的环节上。九、总结回顾整篇文章我们已经完整分析了 3D Gaussian Splatting 的整个可视化流程。从最初的三维高斯表示到最终生成屏幕上的每一个像素其渲染过程可以概括为以下几个阶段训练完成的三维高斯点云世界坐标转相机坐标3D高斯协方差矩阵投影至2D平面计算屏幕空间二维椭圆包围盒图像平面Tile网格划分高斯分配至对应Tile单个Tile内所有高斯按深度升序排序由远至近Alpha透明混合叠加输出最终渲染图像

相关新闻

服务端环境变量_add-setting-env

服务端环境变量_add-setting-env

以下为本文档的中文说明该技能指导开发者如何在LobeHub等Next.js应用中添加服务端环境变量,用于控制用户设置的默认值。其核心功能是建立一套三级优先级体系:用户自定义设置 > 服务端环境变量 > 硬编码默认值。使用场景包括需要为不同部署环境提供…

2026/7/21 0:07:26 阅读更多 →
Kubernetes 生产环境 10 大避坑指南(含排查命令)

Kubernetes 生产环境 10 大避坑指南(含排查命令)

汇总生产环境中最常见的 10 个 Kubernetes 踩坑场景,涵盖 OOM、探针、调度、网络等高频问题,每条都附带排查命令和修复思路。 摘要:汇总 K8s 生产环境高频踩坑场景(OOMKilled、探针误判、Pod 风暴、优雅下线等),每条给出现象、排查命令和修复思路。 预计阅读:15 分钟 目…

2026/7/21 0:06:21 阅读更多 →
云原生安全 Top 10 最佳实践清单(建议收藏)

云原生安全 Top 10 最佳实践清单(建议收藏)

云原生环境的攻击面比传统架构复杂得多,从镜像构建、集群配置到运行时防护,每一层都有独立的安全责任。本文整理 10 项可直接落地的最佳实践,附检查命令和对照 Checklist。 摘要:从镜像构建到运行时防护,按纵深防御思路整理 10 项云原生安全最佳实践,涵盖 RBAC、Secret 管…

2026/7/21 0:06:54 阅读更多 →

最新新闻

继续教育AIGC降噪工具对比:千笔与知文AI评测

继续教育AIGC降噪工具对比:千笔与知文AI评测

1. 项目背景与核心需求解析在教育数字化转型浪潮中,继续教育机构正面临内容生产的效率瓶颈。传统人工创作模式难以满足海量课程资料、培训文档的产出需求,而通用AI内容生成工具又存在专业度不足、风格不符等问题。这个项目对比评测了两款面向继续教育场景…

2026/7/22 5:27:48 阅读更多 →
82个漏洞、27万实例暴露、20万一夜蒸发:OpenClaw“龙虾”的安全真相

82个漏洞、27万实例暴露、20万一夜蒸发:OpenClaw“龙虾”的安全真相

引言2025年底,一款名为OpenClaw的开源AI智能体框架横空出世。短短四个月内,其GitHub星标数突破26万,超越React和Linux内核,成为开源史上增长速度最快的项目。因Logo形似红色小龙虾,它被中文互联网社区昵称为“龙虾”。…

2026/7/22 5:27:48 阅读更多 →
改善static的II优化设计

改善static的II优化设计

案例一: function_foo() { static bool change 0 if (condition_xyz){ change x; // store } y change; // load }案例二: function_readstream() { static bool change 0 bool change_temp 0; if (condition_xyz) { change x; // store change_te…

2026/7/22 5:27:48 阅读更多 →
无犯罪记录公证书在哪里开?无犯罪记录公证书怎么办理?

无犯罪记录公证书在哪里开?无犯罪记录公证书怎么办理?

一、无犯罪记录公证书办理高频痛点办理出国留学、境外务工、移民定居、涉外岗位入职时,绝大多数人都需要提交无犯罪记录公证书。首次办理的用户普遍容易踩坑:分不清 “无犯罪记录证明” 和 “公证书” 的区别,跑错机构白跑腿;异地…

2026/7/22 5:27:48 阅读更多 →
智能仓储与物流——制造业供应链效率的倍增器

智能仓储与物流——制造业供应链效率的倍增器

仓储与物流是制造业供应链的“毛细血管”,其效率直接决定了整个生产系统的响应速度和成本水平。在智能制造时代,传统“人找货”的仓储模式正在被“货到人”的智能模式所颠覆。一、传统仓储的三大痛点 空间利用率低:传统仓库依赖人工叉车和货架…

2026/7/22 5:27:48 阅读更多 →
新药研发数据合规:挑战与解决方案

新药研发数据合规:挑战与解决方案

1. 新药研发企业的数据合规困局在实验室里,研发人员正全神贯注地记录着最新一批抗癌化合物的实验数据。这些看似普通的数字背后,是价值数亿元的研发成果,更是关乎患者生命健康的关键信息。然而很少有人意识到,这些数据正面临着一把…

2026/7/22 5:26:48 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻