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

为什么你的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.

相关推荐
热点推荐
四川省人民医院攻克世界级难题:毫米修肺,让57岁患者重获新生

四川省人民医院攻克世界级难题:毫米修肺,让57岁患者重获新生

封面新闻
2026-10-17 00:01:05
我以前和一个女人同居过 五年后再见面 她开口第一句话 直接把我整愣

我以前和一个女人同居过 五年后再见面 她开口第一句话 直接把我整愣

游戏收藏指南
2026-10-18 06:15:30
周末利空!电表龙头暴降300%陷入亏损,12股业绩暴雷

周末利空!电表龙头暴降300%陷入亏损,12股业绩暴雷

风风顺
2026-10-18 00:35:07
上海国际自然保护周启动,演员陈龙获聘传播大使

上海国际自然保护周启动,演员陈龙获聘传播大使

上观新闻
2026-10-17 20:59:40
首节落后8分,她们末节翻盘拿下队史首场总决赛胜利

首节落后8分,她们末节翻盘拿下队史首场总决赛胜利

慢享生活集
2026-10-18 06:18:13
变天!特朗普突遭重创!

变天!特朗普突遭重创!

财经要参
2026-10-16 07:37:25
订婚现场超吸睛!新娘美得像天仙般惊艳众人,新郎一现身却让全场愣住,这差距到底在哪呢

订婚现场超吸睛!新娘美得像天仙般惊艳众人,新郎一现身却让全场愣住,这差距到底在哪呢

世界圈
2026-10-14 15:27:12
回老家一趟我彻底破防:村里47个五十岁上下的壮年人,全不种地不打工,天天打牌晒太阳,一问存款还没我多

回老家一趟我彻底破防:村里47个五十岁上下的壮年人,全不种地不打工,天天打牌晒太阳,一问存款还没我多

犀利辣椒
2026-09-25 06:21:06
状元首秀悬了!脚踝扭伤离场,他边走边说我没事

状元首秀悬了!脚踝扭伤离场,他边走边说我没事

坠入温柔晚风
2026-10-18 05:29:54
两性心理学:女人主动跟你说例假来了,过来人都懂,她其实是在暗示你这两句话,不要再傻乎乎地听不明白

两性心理学:女人主动跟你说例假来了,过来人都懂,她其实是在暗示你这两句话,不要再傻乎乎地听不明白

心理观察局
2026-09-06 06:41:37
福原爱近况:再婚生3胎,定居东京,开公司财富自由,依旧很漂亮

福原爱近况:再婚生3胎,定居东京,开公司财富自由,依旧很漂亮

大西体育
2026-10-17 10:47:54
如果社保贷普及,一定要去贷

如果社保贷普及,一定要去贷

七叔东山再起
2026-10-17 20:08:26
看了梅婷 ,再看郝蕾才知:会打扮与不会打扮的女人,差距多大

看了梅婷 ,再看郝蕾才知:会打扮与不会打扮的女人,差距多大

娱圈办事处
2026-10-16 17:17:26
地位彻底变了!29岁樊振东低调回国仅24小时,再次官宣新身份!国乒2大信号藏不住了!球迷:终于等到这一天

地位彻底变了!29岁樊振东低调回国仅24小时,再次官宣新身份!国乒2大信号藏不住了!球迷:终于等到这一天

锐评利物浦
2026-10-17 21:05:38
中国乒乓大捷!4-3夺冠,绝杀日本松岛美空,3小将强势登顶

中国乒乓大捷!4-3夺冠,绝杀日本松岛美空,3小将强势登顶

艳儿说电影
2026-10-17 16:29:58
演员童瑶发文告别

演员童瑶发文告别

背包旅行
2026-10-16 11:55:16
上任仅5天 白宫新闻秘书遭特朗普“劝退”

上任仅5天 白宫新闻秘书遭特朗普“劝退”

财联社
2026-10-17 03:40:04
微信资金池接近万亿!可这笔巨款,腾讯一分钱都不能随便花

微信资金池接近万亿!可这笔巨款,腾讯一分钱都不能随便花

青史卷中人
2026-10-17 00:43:22
陈滢在TVB台庆剧戏份收到25宗投诉!张智霖自爆全家看他和陈晓华的激情戏:岳父岳母一起看

陈滢在TVB台庆剧戏份收到25宗投诉!张智霖自爆全家看他和陈晓华的激情戏:岳父岳母一起看

TVB资讯台
2026-10-17 21:10:23
存款大势已定!如果一切正常,明后年居民储蓄或将迎来5大变化

存款大势已定!如果一切正常,明后年居民储蓄或将迎来5大变化

猫叔东山再起
2026-10-17 09:30:18
2026-10-18 06:51:00
我是一个粉刷匠2
我是一个粉刷匠2
有态度网友ytd
222文章数 171关注度
往期回顾 全部

科技要闻

刘煜辉:99%的黄金分析师报告一钱不值

头条要闻

普京:包围并消灭2000人的乌军集群 这非比寻常

头条要闻

普京:包围并消灭2000人的乌军集群 这非比寻常

体育要闻

升级版杨瀚森再闯难关:当上开拓者第三中锋还得拼

娱乐要闻

庾澄庆罕谈前妻 撕下伊能静仅剩的体面

财经要闻

新一轮大跌源头,找到了!

汽车要闻

星瑞L PLUS限时售价10.97万元起 开启智混3L时代

态度原创

旅游
本地
亲子
手机
公开课

旅游要闻

打造移动旅游驿站 满足不同群体需求

本地新闻

因新荣记出圈,这座浙东小城才是吃货天堂

亲子要闻

嘟嘟为了吃口雪糕能有多拼

手机要闻

消息称三星计划开发全新Galaxy OS系统,预计于2028年随Galaxy S28系列手机亮相

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版