网易首页 > 网易号 > 正文 申请入驻

为什么你的3D模型是扁的?缺了这层相机矩阵

0
分享至

“渲染出来的立方体有透视,却没有深度。”这是不少人在 wgpu 里搭 3D 场景时撞上的第一堵墙。问题不在模型,也不在着色器写错了,而是缺了一套相机系统——没有视图矩阵和投影矩阵,顶点坐标会被直接送进 WebGPU 的归一化设备坐标(NDC)裁剪空间。


在 wgpu 里,NDC 是一个有边界的裁剪空间:X 和 Y 的范围是 [-1.0, 1.0],Z 的范围是 [0.0, 1.0]。没有透视矩阵做透视除法,场景就会渲染成一个扁平的 orthographic 盒子。超出这个范围的顶点会被立刻裁掉,物体也不会随着距离变远而变小。

要拿到真实的 3D 深度,得实现一个经典的针孔相机模型,核心是两次矩阵变换。

投影矩阵用 cgmath::perspective 构造一个视锥体,按距离缩放坐标,同时做宽高比校正,这样窗口拉伸时物体不会变形。视图矩阵用 cgmath::Matrix4::look_at_rh,以相机眼位置、目标朝向和“上”向量为参数,在右手坐标系下变换世界空间。

这里有个容易踩的坑:cgmath 是为 OpenGL 设计的,Z 范围是 -1.0 到 1.0。所以需要乘上 OPENGL_TO_WGPU_MATRIX,把 Z 映射到 0.0 到 1.0。最终相机矩阵的写法是:

let camera_matrix = OPENGL_TO_WGPU_MATRIX * proj * view;

矩阵算好了,还得送进 WGSL 着色器。这一步靠 wgpu 的 bind group 建立显式的布局契约。camera_controller.bind_group_layout 在数据进入着色器之前,就告诉 WebGPU 这份 uniform 数据的确切形状和内存可见性,对应着色器里的 @group(0) @binding(0) var camera: CameraUniform;。render_pipeline_layout 则把相机布局注册到 0 号槽位,让管线在绘制调用时知道要去 @group(0) 找相机数据。

绑定策略值得单独说一句。把 bind group 显式分层,引擎才有扩展空间。后面加材质、纹理、灯光时,只要往更高的 group 槽位挂,不用动相机这套设置:

  • Group 0:相机 uniform,每帧或相机移动时更新
  • Group 1:材质与纹理,按网格或材质更新
  • Group 2:灯光数据,场景灯光变化时更新

相机矩阵每帧更新 uniform buffer 之后,就可以围绕任意已加载的 3D 网格自由环绕、平移和缩放了。

相机搞定,另一个拖慢迭代的问题浮出水面:每次改 WGSL 里的颜色或光照公式,都得重启应用。与其预编译着色器,不如用 notify 监听目标文件夹,只要 .wgsl 文件一保存,就在运行时重建 RenderPipeline。

底层机制分三步。第一步是操作系统级的异步追踪,用 notify::RecommendedWatcher 接入系统原生的文件通知接口,在后台监控文件变化,不阻塞渲染线程。第二步是主线程上的通道接收端,后台 watcher 通过线程安全的 mpsc 通道发送文件系统更新,接收端留在主线程待命。第三步是在重绘时触发重载:主事件循环进入 RedrawRequested 阶段时,用 watcher.rx.try_recv() 非阻塞地检查通道,一旦检测到文件修改事件,state.reload_shaders() 就从磁盘读取更新后的 .wgsl 文件,当场替换掉正在使用的 RenderPipeline。

改着色器不用关应用,迭代速度立刻不一样了。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
从一句话到一个能玩的世界,VAST 把整条链路开源了

从一句话到一个能玩的世界,VAST 把整条链路开源了

爱范儿
2026-10-20 22:18:20
张铁林聚餐照曝光!叼大烟斗,桌上摆满老北京铜锅涮肉

张铁林聚餐照曝光!叼大烟斗,桌上摆满老北京铜锅涮肉

草莓解说体育
2026-10-19 06:44:09
工信部:坚决防范不合理创新设计和未经充分研发测试验证的汽车产品进入市场

工信部:坚决防范不合理创新设计和未经充分研发测试验证的汽车产品进入市场

界面新闻
2026-10-20 16:00:20
央视曝光:有人一次寄6000多个包裹 内有练习册、空白试卷 夹带“扶贫福利领取流程图”诈骗传单

央视曝光:有人一次寄6000多个包裹 内有练习册、空白试卷 夹带“扶贫福利领取流程图”诈骗传单

闪电新闻
2026-10-20 21:08:25
2-4,亚马尔破门难救主,巴塞罗那不敌卫冕冠军,遭遇欧冠首败

2-4,亚马尔破门难救主,巴塞罗那不敌卫冕冠军,遭遇欧冠首败

侧身凌空斩
2026-10-21 04:57:04
“浑身都是放纵的痕迹!”母亲晒儿子大学三年变化,连面相都变了,家长认为责任在学校,网友们痛斥

“浑身都是放纵的痕迹!”母亲晒儿子大学三年变化,连面相都变了,家长认为责任在学校,网友们痛斥

蝴蝶花雨话教育
2026-10-20 00:05:15
事态升级!解放军锐评旭日旗事件,陈某迎四大噩耗,不止遣返那么简单

事态升级!解放军锐评旭日旗事件,陈某迎四大噩耗,不止遣返那么简单

秋枫凋零
2026-10-20 16:26:07
“多亏了这笔贷款,不然我真不知道该怎么交上今年的社保”

“多亏了这笔贷款,不然我真不知道该怎么交上今年的社保”

法师今天失业了吗
2026-10-19 23:53:05
刘强东硬刚抖音,引爆全网!

刘强东硬刚抖音,引爆全网!

大佬灼见
2026-10-19 22:42:34
太前卫了!学生情侣约定开房一人一次承担房费,男方多次清算订房记录,女生哭诉经济压力大,聊天记录流出

太前卫了!学生情侣约定开房一人一次承担房费,男方多次清算订房记录,女生哭诉经济压力大,聊天记录流出

火山詩话
2026-10-19 07:59:53
CBA最愚蠢交易!用场均18分悍将换来7分0.5板软蛋,如今后悔不已

CBA最愚蠢交易!用场均18分悍将换来7分0.5板软蛋,如今后悔不已

南海浪花
2026-10-21 08:24:09
吃里扒外!定居美国13年,回国捞金惨遭“驱赶”,53岁活的荒唐!

吃里扒外!定居美国13年,回国捞金惨遭“驱赶”,53岁活的荒唐!

喜欢历史的阿繁
2026-10-21 10:07:14
AI 女模特,已失去底线

AI 女模特,已失去底线

视觉志
2026-10-21 09:58:12
21岁小伙穿越稻城亚丁遇难,真相反转!

21岁小伙穿越稻城亚丁遇难,真相反转!

新动察
2026-10-21 10:07:05
00后员工不好管啊!国庆放假拒参加临时会议,领导群里怒吼:严重违纪降薪1000,不服可提交离职申请,员工回怼“你还活在古代吗”

00后员工不好管啊!国庆放假拒参加临时会议,领导群里怒吼:严重违纪降薪1000,不服可提交离职申请,员工回怼“你还活在古代吗”

火山詩话
2026-10-20 12:23:47
黄景瑜未成名地铁旧照,模样普通认不出

黄景瑜未成名地铁旧照,模样普通认不出

喜欢历史的阿繁
2026-10-20 02:15:38
福登单场独造4球,1.35亿新援处子球,曼城5-1大胜雅典AEK

福登单场独造4球,1.35亿新援处子球,曼城5-1大胜雅典AEK

钉钉陌上花开
2026-10-21 04:53:07
小区物业大撤退!收缴率跌到 16%,售价数百万住宅恐变贫民窟

小区物业大撤退!收缴率跌到 16%,售价数百万住宅恐变贫民窟

风向观察
2026-10-19 20:17:57
《沈阳大东“6·17”较大道路交通事故调查报告》公布,7人被移交纪委监委

《沈阳大东“6·17”较大道路交通事故调查报告》公布,7人被移交纪委监委

界面新闻
2026-10-20 17:52:02
复出5天的小杨哥,撞得“头破血流”

复出5天的小杨哥,撞得“头破血流”

金错刀
2026-10-20 14:17:36
2026-10-21 11:03:00
我是一个粉刷匠2
我是一个粉刷匠2
有态度网友ytd
226文章数 173关注度
往期回顾 全部

科技要闻

马斯克确认SpaceX与特斯拉讨论合并

头条要闻

高速电子屏提示"应急道可用"司机借用却被罚 两省回应

头条要闻

高速电子屏提示"应急道可用"司机借用却被罚 两省回应

体育要闻

巴拉克:天生亚军与漫长极夜

娱乐要闻

刘恺威官宣女友,和杨幂一个天一个地

财经要闻

日赚近5亿的长鑫,股价却跌掉了15000亿

汽车要闻

黑科技一次看全 2026奇瑞全球创新大会干货汇总

态度原创

本地
亲子
游戏
数码
军事航空

本地新闻

一场垂直登高赛跑出了"山城"的真正内核

亲子要闻

养孩子别只惯他,要教他担当

《英雄联盟》K/DA新皮肤公布!皮肤分池抽取

数码要闻

联想百应AI300实测:128G统一内存,玩转本地AI Agent

军事要闻

特朗普狠批泽连斯基"不想结束战争" 泽连斯基强硬回怼

无障碍浏览 进入关怀版