首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >隐藏建筑屋顶&根据世界位置隐藏面/顶点

隐藏建筑屋顶&根据世界位置隐藏面/顶点
EN

Game Development用户
提问于 2016-02-28 19:50:21
回答 2查看 106关注 0票数 1

我目前正在开发一个小游戏,以供我自己享受,我遇到了一个问题。正如您可能知道的,许多第三方游戏(例如probably和XCOM )在进入建筑物时隐藏屋顶,以便您仍然可以看到您的角色。我使用的是lwjgl,我目前的解决方案是,当玩家在建筑物内的时候,使用剪贴板来停止渲染高于一定高度的所有东西,但是这会产生不好的结果,因为如果附近有其他建筑物或高实体,它们也不会呈现在该平面之上。

我想出了一些解决方案--其中之一就是,当我在某些领域时,简单地隐藏某些面孔/顶点。这也适用于其他事物,而不仅仅是建筑物。这是处理这个问题的正确方法吗?还是有更好的方法来处理这件事?

PS。我对openGL (特别是着色器)不是很有经验,所以如果解决方案需要着色工作,我可能需要更详细的描述。

EN

回答 2

Game Development用户

回答已采纳

发布于 2016-02-28 20:40:33

当你进步的时候:

-最终您将使用instancing绘制所有的屋顶,同时使用一个DrawInstanced(.)打电话。在该设置中,我们可以检测到我们位于哪个屋顶(@GarMan),而忽略了一个屋顶实例。

-You还可以激活模板缓冲区,绘制我们所处的屋顶(不输出任何颜色),禁用模板,绘制所有的屋顶(模板屋顶被省略)。清除模板并继续渲染场景。

有很多“最好的方法”来做,就像有意见的人一样。我同意GarMan的观点,即最常见和最简单的方法是使用包围形状来表示卷;BoundingBox、BoundingSphere等。

代码语言:javascript
运行
复制
foreach (roof in g_RoofList)
{
  If (roof->boundingShape.Contains(camera->LookAt))
    //Do nothing
  else
    roof.Draw();
}

//or maybe

foreach (building in g_BuildingList)
{
  building->DrawFloor();
  building->DrawWalls();
  //Draw the roof, or the objects inside, but not both
  If (building->boundingShape.Contains(camera->LookAt))
    building->DrawRoof();
  else
    building->DrawInteriorObjects();
}

因为你才刚刚开始,我建议你先把注意力放在“做好”上,然后再“做好”。当你不断进步的时候,你真的无法绕过你所做的植面工作,回顾你以前的创作。感觉就像一个陌生人写的。

编辑评论:

代码语言:javascript
运行
复制
void RenderScene()
{
  EnableRoofClip();
  //Render only the buildings that contain camera->LookAt
  foreach (building in g_BuildingList)
  {
    If (building->boundingShape.Contains(camera->LookAt))
      building->Draw();
  }

  DisableRoofClip();    
  //Render buildings that do not contain camera->LookAt
  foreach (building in g_BuildingList)
  {
    If (!building->boundingShape.Contains(camera->LookAt))
      building->Draw();
  }
}

他们的...one是简单地隐藏某些面孔/顶点,当我在特定的领域。这也适用于其他事物,而不仅仅是建筑物。这是处理这个问题的正确方法吗?还是有更好的方法来处理这件事?

我不建议在游戏中实现以下内容,因为您已经有了一个可以工作的方法,但是,您可以通过多种方式在GPU上选择顶点,这就是其中之一:

VertexShaders为每个输入创建一个输出。GeometryShaders可以获取输出,然后在每个顶点的基础上选择要丢弃的输出。首先,实现一个简单的GeometryShader,它输出每个输入(什么都不做)。然后,你可以做实验。

没有,没有,正确的方法,而且通常有更好的方法。

一旦你实现了一种更好的方法,你就会找到另一种更好的方法:

https://en.wikipedia.org/wiki/Feature_蠕动

票数 1
EN

Game Development用户

发布于 2016-02-28 20:20:46

一个解决方案是使用简单的碰撞检测之间的相机和字符之间的渲染。例如,您可以将建筑物包装在简单的框中,将从您的视图端口(4个角和中心)到字符的一些射线碰撞,并且您的光线经过的任何框都需要不同的渲染方式。

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/117418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档