我使用godot来创建我的3d游戏。我遇到了一个问题,当创建门户使用相机视口渲染到纹理。问题是相机会捕捉门户后面的不必要的对象。我部分地解决了这个问题,方法是将摄像头的参数"near“设置为从摄像头本身到入口的一段距离,但入口后面的部分开始被切断。问题是,是否有可能隐藏特定相机的对象,以便其他相机可以看到它们?也许有另一种方法可以做到这一点,例如通过创建一个静态剪裁平面?
发布于 2021-05-06 09:22:22
邻近淡入淡出
可能不是您想要的,但为了完整起见,我会提及它。
默认材质具有接近淡入淡出和距离淡入淡出,如果材质离摄影机太近或太远,可以分别使用它们来使材质消失。
重要的是要注意,这不是一个剔除平面,淡入淡出是渐进的。
因此,使用接近淡入淡出可以使摄影机附近的对象显示为半透明。
使用可见层和消隐蒙版
是否可以隐藏特定相机的对象,以便其他相机可以看到它们?
每个VisualInstance (你知道,所有在3D中可见的东西)都有layers。而且每个Camera都有一个cull_mask。如果Camera的cull_mask不包括VisualInstance的任何layers,则Camera看不到该VisualInstance。
没有layers的VisualInstance不会在任何Camera上显示,即使Camera的cull_mask中包含所有layers (这是默认设置)。
您可以编辑摄影机的cull_mask以不包括VisualInstance的layers,也可以编辑VisualInstance的layers,或者同时编辑两者。
使用自定义着色器消隐平面
也许有另一种方法可以做到这一点,例如通过创建一个静态剪裁平面?
您可以使用自定义空间着色器根据平面裁剪对象。
你需要将飞机定义为制服。对于这个答案,我将使用point-normal definition of a plane
n·(r - r_0)这就是:
dot(plane_normal, (world_position - plane_point)因此,我们定义了plane_normal和plane_point制服:
uniform vec3 plane_normal;
uniform vec3 plane_point;plane_normal告诉我们平面的方向,而plane_point是平面上的一个点,我们可以用它来定位它。
然后使用这个逻辑:
vec3 wold_position = (CAMERA_MATRIX * vec4(VERTEX, 1.0)).xyz;
ALPHA = clamp(sign(dot(plane_normal, wold_position - plane_point)), 0.0, 1.0);在这里,我们将当前点的坐标转换为世界空间,然后使用平面的定义来查找一侧的点(使用sign),并基于此设置ALPHA,以便平面一侧的所有内容都不可见。
注意::这不是定义平面的唯一方法。另一个流行的定义是4D向量,其中xyz是法线,w是从平面到原点的距离。
遗憾的是,我不认为有一种方法可以使其与多个材质过程一起工作,因为ALPHA控制过程的混合,不会产生透明度。不,使用discard;也不能解决这个问题,因为其他的传递都可以写入片段。因此,您将需要修改您的材料以包括这一点。
此外,可悲的是,Godot3.x不支持全球统一(参见Godot 4.0 gets global and per-instance shader uniforms)。这意味着您必须在需要它们的任何地方设置这些参数。
使用构造性实体几何(CSG)
添加一个CSGCombiner,使需要与其他CSG节点一起作为子节点消失的几何体。
例如,您可以添加一个operation设置为"Subtraction"的CSGSphere,并使用Camera移动它(为此,我建议添加一个RemoteTransform节点作为Camera的子节点,并将其远程路径设置为CSGSphere)。
当然,它不一定是CSGSphere__,您可以使用任何CSG节点来实现此目的。对于门户,我想您可以使用CSGBox并将其与门户平面对齐。
注意:当前在Godot3.3CSG节点上不支持烘焙灯光。这是一种回归。请参阅:Unable to bake lightmap with CSG due to the lack of ability to generate UV2 for CSG nodes
门户网站,实际上
Bartleby Lawnjelly为Godot3.x提供了一个门户(godot-lportal)模块。
作为一个模块,它们需要从源代码构建Godot。请参阅Godot官方文档上的Compiling。没那么糟,我保证。或者使用来自godot-titan的build。
我必须解释一下,这些门户不是Valve Portal视频游戏系列sense…中的门户该模块允许您将区域定义为“房间”,将平面定义为连接这些房间的“门户”,以便您可以从一个房间看到另一个房间。这样做的目的是剔除整个房间,除非您通过其中一个门户查看。
希望有一个视频能让这更有意义。这是一个有点老的概念,但很容易理解:Portal rendering module in Godot 3.2 - Improved performance。看到视频里的影子大便了吗?Bartleby Lawnjelly也有一个自定义的光照映射器。
https://stackoverflow.com/questions/67408766
复制相似问题