gpt4 book ai didi

c++ - 渲染大量立方体的剔除技术

转载 作者:IT老高 更新时间:2023-10-28 21:45:58 26 4
gpt4 key购买 nike

我正在做一个个人学习项目来制作 Minecraft克隆。除了一件事之外,它工作得很好。与 Minecraft 类似,我的地形在 Y 轴上堆叠了许多立方体,因此您可以向下挖掘。虽然我做了平截头体剔除,但这仍然意味着我无用地绘制了我下面的所有立方体层。立方体按 X、Y 和 Z 顺序排列(尽管仅在 1 个方向上,因此从技术上讲,它不是对相机的 Z 顺序)。我基本上从玩家的位置只添加指向玩家周围立方体的指针。然后我对这些进行截锥剔除。我不做八叉树 segmentation 。我想简单地不渲染玩家下方的图层,除非如果玩家向下看一个洞,这将不起作用。鉴于此,我如何避免渲染我下方的立方体,或者其他立方体隐藏的立方体。

谢谢

void CCubeGame::SetPlayerPosition()
{
PlayerPosition.x = Camera.x / 3;
PlayerPosition.y = ((Camera.y - 2.9) / 3) - 1;
PlayerPosition.z = Camera.z / 3;
}

void CCubeGame::SetCollids()
{

SetPlayerPosition();

int xamount = 70;
int zamount = 70;
int yamount = 17;

int xamountd = xamount * 2;
int zamountd = zamount * 2;
int yamountd = yamount * 2;
PlayerPosition.x -= xamount;

PlayerPosition.y -= yamount;

PlayerPosition.z -= zamount;


collids.clear();
CBox* tmp;

for(int i = 0; i < xamountd; ++i)
{
for(int j = yamountd; j > 0; --j)
{
for(int k = zamountd; k > 0; --k)
{

tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);



if(tmp != 0)
{
if(frustum.sphereInFrustum(tmp->center,25) != NULL)
{
collids.push_back(tmp);
}
}

}
}

}

最佳答案

这是我在编写自己的克隆时学到的东西:

  1. 不要只是将每个立方体都转储到 OpenGL 中,也不要担心自己进行所有可见性修剪。正如另一个答案所述,检查所有 6 个面以查看它们是否被相邻 block 完全遮挡。仅渲染可见的面。这大致将您的面数从立方项(立方体的体积 n*n*n)减少到平方项(表面仅约 n*n)。
  2. OpenGL 可以比您更快地执行视锥体剔除。将所有表面面渲染到显示列表或 VBO 后,只需将整个 blob 发送到 OpenGL。如果您将几何体分解为切片(或 Minecraft 中所说的 block ),您可能会避免绘制可以轻松确定在相机后面的 block 。
  3. 将整个几何图形渲染到一个(或多个)显示列表中,然后每次都重新绘制。如果您使用立即模式,这是一个简单的步骤,因为您只需将现有代码包装在 glNewList/glEndList 中并使用 glCallList 重绘。减少 OpenGL 调用计数(每帧)将比减少要渲染的多边形的总体积产生更大的影响。
  4. 一旦您看到生成显示列表比绘制它们需要多长时间,您就会开始考虑如何将更新放入线程中。这就是转换为 VBO 得到返回的地方:线程渲染成普通的旧数组(例如,将 3 个 float 添加到数组而不是调用 glVertex3f),然后 GL 线程只需使用 glBufferSubData 将它们加载到卡中。你赢了两次:代码可以在一个线程中运行,它可以通过 3 次数组写入而不是 3 次函数调用来“绘制”一个点。

我注意到的其他事情:

VBO 和显示列表具有非常相似的性能。给定的 OpenGL 实现很可能在内部使用 VBO 来存储显示列表。我跳过了顶点数组(一种客户端 VBO),所以我不确定这些。使用 VBO 的 ARB 扩展版本而不是 GL 1.5 标准,因为 Intel 驱动程序只实现扩展(尽管声称支持 1.5),而 nvidia 和 ATI 驱动程序不在乎。

纹理图集规则。如果您为每个面使用一种纹理,请查看图集的工作原理。

如果你想看我的代码,请在 github 上找到我。

关于c++ - 渲染大量立方体的剔除技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3693407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com