Replies: 6 comments 3 replies
-
3d坐标直接取深度反算?entity独立id可以考虑直接并入材质系统或者gbuffer?但感觉实际还是不划算,N帧才会使用1次。或者可以考虑先用surface area启发式的bounding box ray tracing过滤出需要的object,然后单独绘制计算,输出1个点就行了,这样可能适用于手机。PC的话直接走一个cpu ray tracing得了。如果面数不高或者有lod并且可以牺牲一点点精度的话,手机CPU ray tracing应该都行。 |
Beta Was this translation helpful? Give feedback.
-
那么设计上我觉得应该是:
|
Beta Was this translation helpful? Give feedback.
-
哦是了,entity id可以并入材质id或者gbuffer之类的东西,然后需要的时候用shader开关去转换,如果是forward的话,就没有办法只能走CPU或者单独加速。 |
Beta Was this translation helpful? Give feedback.
-
不要把问题想复杂了。我认为这个问题应该和场景分离开作为独立问题处理。 这个问题本质上:
大多数情况下:
所以,即使在 GPU 中有潜在的性能收益。但和实现复杂度相比,未必划算。 |
Beta Was this translation helpful? Give feedback.
-
mmo 游戏,非常需要这个东西 ~ |
Beta Was this translation helpful? Give feedback.
-
我觉得这可以理解成一种“不渲染的Mesh” 基于ecs架构来做这部分数据的设计会非常舒适,假如这样设计:
很显然,mesh被绑定到entity的时候我们并不在乎它具体是用来做什么的,而我们对应的system也只需要 select 出自己关心的那部分数据(比如 "mesh:in touchable:in"?) |
Beta Was this translation helpful? Give feedback.
-
目前引擎支持从屏幕上的一个点找到选中的那个对象,它是通过 GPU 完成的。方法是给需要被点选的 entity 赋予一个独立的 id 。然后通过渲染流程,找到屏幕上那个点对应的 entity 的 id 。
最近我发现,另外一种需求也很常见:鼠标点中屏幕后,需要知道对应点在 3d 空间中的坐标,而不关心点中了什么。
这里可以有很多假设:需要点击的物件是静态的、简单的、不需要跟着场景变化。比如,在第三人称上帝视角的游戏中,我们可能只关心点击了地图的那块地板。
有了这些假设,实现会非常简单高效。
所以,可以有这么一个模块:
场景中有一个(或多个)用于处理鼠标点选的 entity ,它不参与渲染。运行期间可以把若干模型(以 prefab 的形式)添加到这个 entity 的内部数据中。而它内部的数据是由三角形构成,不区分物件。即,每次添加都拆解成若干三角形合并进内部 buffer 。
当需要点选时,传入一个屏幕坐标和摄像机的状态(默认为场景主摄像机),返回选中的点的 3d 空间的位置。
如果需要处理的只是平的地板,那么用两个三角形就可以描述;如果地板有起伏,则需要根据高度图换算成三角形,但不需要和场景中用于渲染的地表模型共用数据。
如果三角形不多,那么用简单的依次遍历的方式实现就很简单,性能应该也不错。毕竟,点选需求并不是每帧都要做的。如果以后遇到更复杂更多三角形的情况,可以考虑用复杂一点的空间结构组织内部的数据,把 O(n) 的过程优化为 O(log N) 。
Beta Was this translation helpful? Give feedback.
All reactions