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

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

相关推荐
热点推荐
高校“折腾”的结果只有一个,那就是老师们都开始不务正业了!

高校“折腾”的结果只有一个,那就是老师们都开始不务正业了!

职场资深秘书
2026-10-19 14:29:12
79年,张国焘冻死于老人院,许世友:除了毛泽东,谁也不是他对手

79年,张国焘冻死于老人院,许世友:除了毛泽东,谁也不是他对手

雍亲王府
2026-08-18 17:55:03
美国大使警告欧洲:动马斯克的频谱,就拿保时捷和LV的真金白银换

美国大使警告欧洲:动马斯克的频谱,就拿保时捷和LV的真金白银换

林子说事
2026-10-20 13:43:01
男子16岁时便出轨嫂子,婚后瞒着妻子继续出轨,还与嫂子生下一子

男子16岁时便出轨嫂子,婚后瞒着妻子继续出轨,还与嫂子生下一子

老猫观点
2026-05-07 07:12:10
董路:谁说我没朋友?很多前国脚都支持我!和杨毅黄健翔闹翻很正常

董路:谁说我没朋友?很多前国脚都支持我!和杨毅黄健翔闹翻很正常

念洲
2026-10-20 07:56:20
激吻田曦薇爆红…《嫁金钗》男主是韩团偶像「长脑瘤」剃发动手术

激吻田曦薇爆红…《嫁金钗》男主是韩团偶像「长脑瘤」剃发动手术

ETtoday星光云
2026-10-19 10:55:06
泰国电诈再升级!中大使馆曝猛料,多方暗中勾结,专卖此类中国人

泰国电诈再升级!中大使馆曝猛料,多方暗中勾结,专卖此类中国人

史智文道
2026-10-20 09:51:05
悔不当初!朱锐自曝已破产,炒股赔了70万,目前处于退圈失业状态

悔不当初!朱锐自曝已破产,炒股赔了70万,目前处于退圈失业状态

娱说瑜悦
2026-08-03 18:35:15
农残最多的5种蔬菜,用水冲洗都洗不干净,都是常吃的,了解一下

农残最多的5种蔬菜,用水冲洗都洗不干净,都是常吃的,了解一下

思思夜话
2026-10-19 11:23:11
马斯克:我用星链把地球包住!中国:用高轨卫星,从外面把你包住

马斯克:我用星链把地球包住!中国:用高轨卫星,从外面把你包住

兵卒史
2026-08-06 08:46:30
不管你信不信,能吃能喝的老人,基本在71岁,已经不做这4件事了

不管你信不信,能吃能喝的老人,基本在71岁,已经不做这4件事了

新时代的两性情感
2026-10-19 03:06:11
女子半夜借口上厕所,约男网友发生关系,男网友嫌她长得丑不愿意,两人打起来,女子再次被发现身上盖满树叶

女子半夜借口上厕所,约男网友发生关系,男网友嫌她长得丑不愿意,两人打起来,女子再次被发现身上盖满树叶

丫头舫
2026-10-15 20:20:24
美国突然发现一奇怪现象:中国的歼11,几乎成了收拾美军的主力

美国突然发现一奇怪现象:中国的歼11,几乎成了收拾美军的主力

世间一分钟
2026-09-27 21:16:13
打不得!日本战舰闯入台海峡,我军为什么不直接击沉它?

打不得!日本战舰闯入台海峡,我军为什么不直接击沉它?

阿凫爱吐槽
2026-10-18 15:16:57
2012年,上海南京东路,好莱坞女星查理兹·塞隆来华拍摄广告

2012年,上海南京东路,好莱坞女星查理兹·塞隆来华拍摄广告

娱你同欢
2026-10-18 12:40:58
蔡磊现状:两年没出卧室,夫妻同城却基本不见,妻子专职带货

蔡磊现状:两年没出卧室,夫妻同城却基本不见,妻子专职带货

大鱼简科
2026-09-28 09:27:18
背叛中国、又出卖美国!臭名昭著的华裔双面间谍高瞻,下场如何?

背叛中国、又出卖美国!臭名昭著的华裔双面间谍高瞻,下场如何?

马探解说体育
2026-10-18 16:55:11
美国:火电厂投资首超中国!中国:忘了告你,我今年玩新能源电厂

美国:火电厂投资首超中国!中国:忘了告你,我今年玩新能源电厂

乌克兰小静
2026-10-15 07:59:37
抄底万达之后,私募大佬又对恒大下手了

抄底万达之后,私募大佬又对恒大下手了

金融八卦女
2026-10-20 17:41:30
独生女车祸身亡,80岁父母获赔5年生活费;10年后钱用完了,两人再次起诉,法院判决:侵权人及保险公司继续支付5年生活费

独生女车祸身亡,80岁父母获赔5年生活费;10年后钱用完了,两人再次起诉,法院判决:侵权人及保险公司继续支付5年生活费

都市快报橙柿互动
2026-10-20 00:39:19
2026-10-21 04:32:49
我是一个粉刷匠2
我是一个粉刷匠2
有态度网友ytd
213文章数 173关注度
往期回顾 全部

科技要闻

新版MiniMax,能和DeepSeek掰手腕吗?

头条要闻

距中国台湾110公里 日美出动6万人大举军演为历史之最

头条要闻

距中国台湾110公里 日美出动6万人大举军演为历史之最

体育要闻

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

娱乐要闻

刘恺威承认新恋情,打球认识

财经要闻

抄底万达之后 私募大佬又对恒大下手了

汽车要闻

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

态度原创

教育
数码
本地
公开课
军事航空

教育要闻

悲哀!16岁男孩沉迷游戏,父亲怒摔手机,儿子多日拒上学,父母花8999元重买手机,才换回孩子上学

数码要闻

Mac版Perplexity Computer新增端侧模式,要求36GB统一内存

本地新闻

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

公开课

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

军事要闻

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

无障碍浏览 进入关怀版