尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Bevy 渲染管线迁移指南:八面体编码 shader 工具函数从 `bevy_pbr` 迁移到 `bevy_render`
Bevy 渲染管线迁移指南八面体编码 shader 工具函数从bevy_pbr迁移到bevy_render【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy本文基于 Bevy 迁移指南 shader_octahedral_moved.md讲解 shaderWGSL层面的八面体octahedral法线编码/解码工具函数octahedral_encode、octahedral_decode、octahedral_decode_signed如何从bevy_pbr::utils迁移到bevy_render::utils为什么这些函数被下沉到更底层的 crate、新位置下完整的函数清单与实现细节以及自定义 shader 需要修改哪些#import语句。读完本篇你可以正确处理升级 Bevy 后自定义着色器中因 import 路径变化导致的编译失败并理解八面体编码在 Bevy 顶点压缩、meshlet 几何压缩与全局光照采样中的实际用途。变更内容shader 工具函数的新 import 路径迁移指南给出的变更非常直接三个八面体编码 shader 函数从bevy_pbr::utils命名空间移到了bevy_render::utils命名空间。升级前与升级后的写法对比如下// BEFORE #import bevy_pbr::utils::{octahedral_encode, octahedral_decode, octahedral_decode_signed} // AFTER #import bevy_render::utils::{octahedral_encode, octahedral_decode, octahedral_decode_signed}这意味着如果你在项目或第三方插件的自定义 shader 中通过#import引入了这三个函数只需把bevy_pbr::utils替换为bevy_render::utils函数名与签名均保持不变无需改动任何函数调用逻辑。从源码结构看这次迁移的动机是合理且清晰的八面体编码本质上是一种通用的向量压缩/解压数学工具而非 PBR 光照计算的一部分。当前仓库中该实现位于 crates/bevy_render/src/utils.wesl并且调用方横跨多个 crate——除了bevy_pbr之外bevy_solari实时 GI与bevy_dev_tools调试叠加层的 shader 也都引用它。把它放在依赖层级更低的bevy_render中可以让所有渲染相关 crate 共享同一份实现而不必让bevy_solari等 crate 仅仅为了一个数学函数去依赖bevy_pbr。新位置bevy_render::utils中完整可用的函数清单迁移后的utils模块由 crates/bevy_render/src/utils.wesl 定义实际暴露的函数比迁移指南提到的三个更多它同时服务于顶点属性压缩场景。仓库中该文件的完整函数为函数输入/输出用途octahedral_encode(v: vec3f32) - vec2f32单位向量 → [0, 1] 区间八面体坐标编码法线或单位方向向量结果可直接映射到 Unorm 格式octahedral_decode(v: vec2f32) - vec3f32[0, 1] 区间坐标 → 单位向量解码上一步的结果octahedral_decode_signed(v: vec2f32) - vec3f32[-1, 1] 区间坐标 → 单位向量解码 Snorm 格式存储的八面体坐标octahedral_decode_tangent(v: vec2f32) - vec4f32带符号编码坐标 → 切线符号解码切线向量w 分量为符号位decompress_vertex_normal(compressed_normal: vec2f32) - vec3f32压缩法线 → 法线内部即调用octahedral_decode_signeddecompress_vertex_tangent(compressed_tangent: vec2f32) - vec4f32压缩切线 → 切线符号内部即调用octahedral_decode_tangentdecompress_vertex_position(compressed_position: vec4f32, aabb_center, aabb_half_extents) - vec3f32压缩位置 AABB 参数 → 世界位置位置反量化decompress_vertex_uv(compressed_uv: vec2f32, uv_min_and_extents: vec4f32) - vec2f32压缩 UV 范围参数 → UVUV 反量化以octahedral_encode的实现为例crates/bevy_render/src/utils.wesl// https://jcgt.org/published/0003/02/01/paper.pdf // For encoding normals or unit direction vectors as octahedral coordinates. fn octahedral_encode(v: vec3f32) - vec2f32 { var n v / (abs(v.x) abs(v.y) abs(v.z)); let octahedral_wrap (1.0 - abs(n.yx)) * select(vec2(-1.0), vec2(1.0), n.xy vec2f(0.0)); let n_xy select(octahedral_wrap, n.xy, n.z 0.0); return n_xy * 0.5 0.5; } // For decoding normals or unit direction vectors from octahedral coordinates. fn octahedral_decode(v: vec2f32) - vec3f32 { let f v * 2.0 - 1.0; return octahedral_decode_signed(f); } // For decoding normals or unit direction vectors from octahedral coordinates. Input is [-1, 1]. fn octahedral_decode_signed(v: vec2f32) - vec3f32 { var n vec3(v.xy, 1.0 - abs(v.x) - abs(v.y)); let t saturate(-n.z); let w select(vec2(t), vec2(-t), n.xy vec2(0.0)); n vec3(n.xy w, n.z); return normalize(n); }实现注释中引用的 JCGT 论文Fast, Accurate, and Robust Normal Encoding Using Octahedral Vectors and the Sign Bit说明了算法来源先除以|x| |y| |z|把向量投影到八面体上正八面体z ≥ 0与负八面体z 0octahedral_wrap折返分别用不同映射最后* 0.5 0.5把结果平移到 [0, 1] 区间方便以 16 位无符号/有符号整数格式存储。octahedral_decode_signed则是其严格逆过程输入约定为 [-1, 1] 区间即 Snorm 反量化后的值。迁移后的仓库内调用现状在当前仓库中所有引用方均已经使用新路径bevy_render::utils可以作为迁移写法的参照示例crates/bevy_pbr/src/meshlet/bindings.weslimport bevy_render::utils::octahedral_decode_signed;meshlet 压缩顶点解码crates/bevy_pbr/src/deferred/functions.weslimport bevy_render::utils::{octahedral_encode, octahedral_decode};延迟渲染 GBuffer 读写crates/bevy_solari/src/realtime/restir.wesl、crates/bevy_solari/src/realtime/gbuffer_utils.wesl、crates/bevy_solari/src/realtime/initial_path.wesl、crates/bevy_solari/src/realtime/presample_light_tiles.wesl、crates/bevy_solari/src/realtime/resolve_dlss_rr_textures.wesl实时 GI 管线中编码/解码光源方向与采样方向crates/bevy_dev_tools/src/debug_overlay.wesl调试叠加层解码压缩法线如果你的自定义 shader 之前写的是#import bevy_pbr::utils::...对照上述任一文件的 import 行即可确认目标写法单函数与{...}多函数两种形式均支持。底层原理与 Rust 侧的对应实现理解这次迁移绕不开八面体编码在 Bevy 中的两大应用场景。场景一mesh 顶点属性压缩。bevy_mesh提供了 CPU 侧的 Rust 实现位于 crates/bevy_mesh/src/vertex.rs包括octahedral_encode_signed输出 [-1, 1] 区间、octahedral_encode_tangent、octahedral_decode_signed与octahedral_decode_tangent。当 mesh 开启属性压缩时MeshAttributeCompressionFlags见 crates/bevy_mesh/src/mesh.rs 中关于 Snorm16x2 法线的说明法线与切线从Float32x3/Float32x4转换为由八面体编码后的Snorm16x2——每顶点法线从 12 字节降到 4 字节。GPU 侧解码时正好调用decompress_vertex_normal/decompress_vertex_tangent即octahedral_decode_signed/octahedral_decode_tangent。同文件中还有octahedral_encode_decode单元测试验证了编码/解码在含符号位切线在内的多种边界向量上的往返精度。场景二meshlet 几何压缩。crates/bevy_pbr/src/meshlet/from_mesh.rs 在构建 meshlet 数据时对法线执行pack2x16snorm(octahedral_encode(normal))即以 16 位有符号归一化整数打包两个分量上传 GPUshader 端再用octahedral_decode_signed恢复。shader 侧与 Rust 侧的一个细节差异值得注意crates/bevy_render/src/utils.wesl 中octahedral_encode的返回值经过* 0.5 0.5平移落在 [0, 1] 区间因此配套解码用octahedral_decode而 Rust 侧octahedral_encode_signed保持 [-1, 1] 区间配套解码用octahedral_decode_signed。两者是同一算法在不同数值区间约定下的变体选择哪一对取决于你的数据存储格式Unorm 还是 Snorm。实操迁移步骤对自定义 shader 用户而言迁移只需一步打开所有自定义.wesl/ shader 文件全局替换bevy_pbr::utils为bevy_render::utils仅限这三个八面体函数所在的 import 语句如果你的 import 里还有其它函数需按函数实际所在的模块拆分语句。确认函数调用处无需改动——函数名与签名在迁移前后保持一致。重新运行应用shader 编译期即可验证 import 路径是否生效。需要注意的前提该 import 语法基于 Bevy 当前使用的.weslshader 格式迁移指南对应 PR 编号为 21926适用于升级到包含该 PR 的 Bevy 版本之后。如果你的代码同时依赖旧的bevy_pbr::utils中其它非八面体符号请逐个核对每个符号在新版本中的实际位置而不是整段机械替换。小结本次迁移只改变了 shader 工具函数的命名空间位置bevy_pbr::utils::{octahedral_encode, octahedral_decode, octahedral_decode_signed}→bevy_render::utils::{...}API 完全兼容。新位置 crates/bevy_render/src/utils.wesl 还额外提供octahedral_decode_tangent、decompress_vertex_normal/tangent/position/uv等与顶点压缩相关的函数可一并按需引入。算法实现与 crates/bevy_mesh/src/vertex.rs 中的 Rust 侧编码/解码互为 CPU/GPU 配对理解这对关系有助于在自定义资产管线上复用 Bevy 的八面体压缩格式。【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

鸿蒙React Native自定义分段控件实现

鸿蒙React Native自定义分段控件实现

1. SegmentControl看着简单&#xff0c;为什么到了鸿蒙这里就得自己造轮子先说结论&#xff1a;分段控件这东西&#xff0c;在iOS和Android上都有现成的原生组件&#xff0c;但在OpenHarmony的React Native生态里&#xff0c;官方并没有直接给你一个<SegmentControl />可…

📅 2026/9/8 21:48:51
Windows 11瘦身到3GB:tiny11builder完整实操指南

Windows 11瘦身到3GB:tiny11builder完整实操指南

Windows 11瘦身到3GB&#xff1a;tiny11builder完整实操指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 重装完笔记本&#xff0c;你发现C盘又小了30个G。开源…

📅 2026/9/9 23:19:26
3步精简Windows 11,老电脑重获新生

3步精简Windows 11,老电脑重获新生

3步精简Windows 11&#xff0c;老电脑重获新生 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 那台用了五六年的笔记本&#xff0c;装完系统后开机要等好一会儿&a…

📅 2026/9/8 21:43:50
MORE NEWS

更多资讯

📰

分布式计算中的检查点机制:Flink状态恢复原理与实战

做分布式计算的同学&#xff0c;估计都有过这种经历&#xff1a;凌晨三点被电话叫醒&#xff0c;打开监控一看&#xff0c;某个节点的进程没了&#xff0c;任务失败&#xff0c;数据要从头开始重跑。如果任务跑了两小时&#xff0c;你就要再等两小时才能重新产出结果。这个场景…

📰

分布式计算检查点机制:原理、实现与调优实战

没做检查点之前&#xff0c;我一直觉得分布式计算的任务挂了大不了重跑一遍&#xff0c;直到第一次跑一个十几个小时的离线任务在最后一步挂在凌晨三点&#xff0c;第二天早上才发现需要从头再来&#xff0c;那个滋味谁经历过谁知道。后来认真研究并实践了检查点机制&#xff0…

📰

用15个Claude智能体重构研发流程:多Agent协作实战指南

"一个人要干一整个公司的活"这话换在五年前我是打死不信的&#xff0c;直到我认真跟这个由YC掌门人带火的开源玩法死磕了两周&#xff0c;用一整套Claude智能体矩阵把原本至少需要七八个人的研发流程硬生生扛了下来。这篇文章不聊虚的&#xff0c;就讲15个硬核Agent怎…

📰

MFC+CSocket聊天室开发实战:原理、代码与避坑指南

简介&#xff1a;基于VS2010和CSocket编写的MFC聊天室服务器端程序&#xff0c;面向需要完成网络编程课程设计或毕业设计的开发者&#xff0c;也适合对Socket通信机制感兴趣的中初级程序员。服务器端启动后可与多个客户端同时建立连接&#xff0c;并支撑客户端之间相互转发消息…

📰

Ultralytics 平台团队角色与权限体系详解:Owner、Admin、Editor、Viewer 的 RBAC 指南

Ultralytics 平台团队角色与权限体系详解&#xff1a;Owner、Admin、Editor、Viewer 的 RBAC 指南 【免费下载链接】ultralytics Ultralytics YOLO26, YOLO11, YOLOv8 — object detection, instance segmentation, semantic segmentation, image classification, pose estimat…

📰

嵌入法特征选择全解析:原理、三大实现路径与Python实战

特征选择里&#xff0c;过滤法&#xff08;Filter&#xff09;快但粗&#xff0c;包装法&#xff08;Wrapper&#xff09;准但贵&#xff0c;而嵌入法&#xff08;Embedded&#xff09;恰好踩在跷跷板中间——它把“选哪些特征”直接塞进模型训练过程里&#xff0c;让模型一边学…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬