我目前正在开发一个小游戏,以供我自己享受,我遇到了一个问题。正如您可能知道的,许多第三方游戏(例如probably和XCOM )在进入建筑物时隐藏屋顶,以便您仍然可以看到您的角色。我使用的是lwjgl,我目前的解决方案是,当玩家在建筑物内的时候,使用剪贴板来停止渲染高于一定高度的所有东西,但是这会产生不好的结果,因为如果附近有其他建筑物或高实体,它们也不会呈现在该平面之上。
我想出了一些解决方案--其中之一就是,当我在某些领域时,简单地隐藏某些面孔/顶点。这也适用于其他事物,而不仅仅是建筑物。这是处理这个问题的正确方法吗?还是有更好的方法来处理这件事?
PS。我对openGL (特别是着色器)不是很有经验,所以如果解决方案需要着色工作,我可能需要更详细的描述。
发布于 2016-02-28 20:40:33
当你进步的时候:
-最终您将使用instancing绘制所有的屋顶,同时使用一个DrawInstanced(.)打电话。在该设置中,我们可以检测到我们位于哪个屋顶(@GarMan),而忽略了一个屋顶实例。
-You还可以激活模板缓冲区,绘制我们所处的屋顶(不输出任何颜色),禁用模板,绘制所有的屋顶(模板屋顶被省略)。清除模板并继续渲染场景。
有很多“最好的方法”来做,就像有意见的人一样。我同意GarMan的观点,即最常见和最简单的方法是使用包围形状来表示卷;BoundingBox、BoundingSphere等。
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();
}
因为你才刚刚开始,我建议你先把注意力放在“做好”上,然后再“做好”。当你不断进步的时候,你真的无法绕过你所做的植面工作,回顾你以前的创作。感觉就像一个陌生人写的。
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,它输出每个输入(什么都不做)。然后,你可以做实验。
没有,没有,正确的方法,而且通常有更好的方法。
一旦你实现了一种更好的方法,你就会找到另一种更好的方法:
发布于 2016-02-28 20:20:46
一个解决方案是使用简单的碰撞检测之间的相机和字符之间的渲染。例如,您可以将建筑物包装在简单的框中,将从您的视图端口(4个角和中心)到字符的一些射线碰撞,并且您的光线经过的任何框都需要不同的渲染方式。
https://gamedev.stackexchange.com/questions/117418
复制相似问题