首页 / 资讯中心 / 文章详情

Godot PointMesh 实战:3 行代码搞定粒子点渲染,附点云与动态点大小

Godot PointMesh 实战:3 行代码搞定粒子点渲染,附点云与动态点大小 ★ FEATURED ARTICLE
Godot PointMesh 实战3 行代码搞定粒子点渲染附点云与动态点大小【免费下载链接】godot-docsGodot Engine official documentation项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs渲染上千个粒子时帧率暴跌多半是因为每个粒子还是一整块网格。在 Godot 里你可以把每个粒子画成一个点就完事——这正是 PointMesh 的设计用途一种“单点”图元网格不依赖三角形在屏幕上被画成恒定像素大小的矩形是粒子系统、点云可视化与 billboard 点精灵billboard sprite始终面向相机的贴片最省事的渲染方案。三行代码画出第一个 Godot PointMesh先看效果再聊原理。把下面这段放进任意 3D 节点的_ready()里var mesh_instance : MeshInstance3D.new() var point_mesh : PointMesh.new() var mat : StandardMaterial3D.new() mat.use_point_size true mat.point_size 8.0 point_mesh.material mat mesh_instance.mesh point_mesh add_child(mesh_instance)跑起来场景里会多出一个 8 像素见方的小点——一个 Godot PointMesh 就成了。C# 用户等价写法new PointMesh()、mat.UsePointSize true、mat.PointSize 8f逻辑完全一致。更多细节见 PointMesh 类参考。一个点为什么够用恒定像素、天然正对相机你可能会觉得只给一个顶点太寒酸但点渲染的“寒酸”恰恰是卖点恒定像素大小。点的大小由材质或着色器以像素直接给定和相机距离无关三角形网格近大远小的透视缩放点在屏幕上不会发生。天然正对相机。GPU 把点栅格化为一个屏幕对齐的矩形这本身就是 billboard 精灵billboard即始终面向相机的对象的效果——地图标记、远景特效这类“永远朝脸”的小图标不用开billboard_mode就白嫖了朝向。零三角形。没有面、没有法线、没有正反面一堆顶点级材质属性对它直接失效后文坑位见。这正是它能轻松扛住海量实例的底气。Godot 点大小怎么设置两个开关与一棵决策树先回答唯一的关键问题你用的是哪种材质用内置 StandardMaterial3D打开 use_point_size不写着色器、直接拿StandardMaterial3D时只有两个开关都挂在BaseMaterial3D上use_point_sizebool默认false总开关不开的话point_size设置多少都白搭point_sizefloat默认1.0单位是像素1 像素在屏幕上基本不可见建议从 4.0 起步再调。类参考里特意强调了该开关只对“基于点”的几何体生效对三角形网格无效别指望它让普通网格的点变大。用 ShaderMaterial在 vertex 阶段写 POINT_SIZE如果你已经用了自定义ShaderMaterial材质开关帮不上忙要在顶点着色器里写内置变量POINT_SIZEinout float。它还能和片段阶段的POINT_COORD点矩形内的归一化坐标范围 0.0~1.0搭配做形状裁剪比如把方点剪成圆点shader_type spatial; void vertex() { POINT_SIZE 16.0; // 点直径单位像素 } void fragment() { vec2 d POINT_COORD - vec2(0.5); if (dot(d, d) 0.25) { discard; // 超出半径的片段丢掉留下圆形 } ALBEDO vec3(0.8, 0.4, 0.9); }从 GLSL 迁移的话把gl_PointSize换成POINT_SIZE即可别的不用动。变量清单可查空间着色器参考文档。用 Godot PointMesh 必踩的 6 个坑⚠️ 都是“代码看着对、效果就是不对”的类型过一遍能省不少排查时间点看不见use_point_size默认关闭且point_size只有 1.0 像素对策是显式打开开关并调到 4.0 以上。billboard_mode/grow/cull_mode无效点天然正对相机且没有表面与法线、没有正反面对策是不必设置设了也没有作用。远处的点不缩小点大小以像素为单位不走透视缩放若想要近大远小在着色器里按深度自行计算POINT_SIZE见进阶玩法。点是方的GPU 点图元栅格化出来就是矩形要圆形就在片段阶段用POINT_COORD配合discard裁剪。CSG 节点用不了它PointMesh是非流形non-manifold面与边不封闭图元布尔运算无从下手CSG 场景请改用BoxMesh、SphereMesh等。着色器偏移顶点后点消失视锥剔除frustum culling把视野外的物体不送去渲染仍按原始位置的包围盒判断会误杀对策是用custom_aabb把包围盒扩到偏移范围。同一个点两种进阶玩法点云可视化MultiMesh 批量实例化 5000 个点要把几千个采样点画成点云千万别逐点建节点。把同一个PointMesh交给MultiMesh用实例化instancing一次绘制调用画上千份副本扛住数量每个实例只换变换var mat : StandardMaterial3D.new() mat.use_point_size true mat.point_size 4.0 var pm : PointMesh.new() pm.material mat var mm : MultiMesh.new() mm.mesh pm mm.instance_count 5000 for i in 5000: var t : Transform3D() t.origin Vector3(randf_range(-10, 10), randf_range(-5, 5), randf_range(-10, 10)) mm.set_instance_transform(i, t)再建一个MultiMeshInstance3D把mm赋给它的multimesh属性并加入场景一片点云就铺满了。所有实例共享同一份PointMesh资源只有位置不同GPU 侧开销远低于逐实例提交。着色器动态点大小让远处的点自动缩小“恒定像素”既是特性也是限制。想要近大远小就在顶点阶段把顶点投影到裁剪空间取深度反推像素大小shader_type spatial; void vertex() { vec4 clip PROJECTION_MATRIX * (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)); // clip.w 是视图空间下到相机的距离越远点越小 POINT_SIZE clamp(80.0 / max(clip.w, 0.5), 2.0, 16.0); }改完之后PointMesh也能有透视感适合密度不均的点云和远景粒子。Godot PointMesh 适合什么能力边界与延伸阅读一句话划界适合海量、恒定像素、不关心法线与光照的点粒子、点云、小图标不适合需要真实光照、背面剔除或 CSG 布尔运算的几何体。需要透视缩放与贴图细节时换QuadMesh或SphereMesh别硬掰 PointMesh。想继续往下挖空间着色器内置变量POINT_SIZE、POINT_COORD及相关矩阵变量一览3D 粒子系统教程用 Draw Pass 搭完整粒子系统把网格换成 PointMesh 只需改一行。【免费下载链接】godot-docsGodot Engine official documentation项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站