C++ 从立方体阵列中删除内部面的最佳方法是什么?
我正在尝试用opengl创建一个看起来很像的Minecraft,并且已经到了可以绘制聚集在一起的立方体“块”的地步。然而,我似乎找不到一个好方法来移除多维数据集中所有看不见的面(一个16x16x16的多维数据集) 我已经为一个立方体创建了基本的基础设施(所有面坐标彼此分离),然后复制所有立方体信息并使用glm::translate和DrawVertexArray绘制 e、 g:背面C++ 从立方体阵列中删除内部面的最佳方法是什么?,c++,opengl,visual-c++,opengl-4,C++,Opengl,Visual C++,Opengl 4,我正在尝试用opengl创建一个看起来很像的Minecraft,并且已经到了可以绘制聚集在一起的立方体“块”的地步。然而,我似乎找不到一个好方法来移除多维数据集中所有看不见的面(一个16x16x16的多维数据集) 我已经为一个立方体创建了基本的基础设施(所有面坐标彼此分离),然后复制所有立方体信息并使用glm::translate和DrawVertexArray绘制 e、 g:背面 float cubeMapTest1[] = { // Back face -0.5f, -0.5
float cubeMapTest1[] =
{
// Back face
-0.5f, -0.5, -0.5f, 0.0f, 0.0f, // Bottom-left
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, // bottom-right
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, // top-left
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, // bottom-left
};
//
//
//^^^对所有6个面重复此操作^^^
//然后创建一个从0到16^3的值的立方体,以便以后绘制
std::vector<glm::vec3> cubePositions;
int i = 0;
int chunkSize = 16;
int chunkVolume = chunkSize * chunkSize * chunkSize;
for (size_t j = 0; j < chunkSize; j++)
{
for (size_t k = 0; k < chunkSize; k++)
{
for (size_t h = 0; h < chunkSize; h++)
{
i++;
//order of h j k affect layers
cubePositions.resize(i + 1);
cubePositions[i] = { h, j, k };
}
}
}
std::向量立方位置;
int i=0;
int chunkSize=16;
int chunkVolume=chunkSize*chunkSize*chunkSize;
对于(大小j=0;j
//边启动边循环
//画
//
这样,我是否应该使用法线来确定要“剔除”哪些内表面?考虑到我的目标,最好的筛选方法是什么?我知道这很混乱,我的问题有点模糊,但我不知道从哪里开始这个问题。稍后我将使用实例和索引对其进行优化。算法本身非常简单。对于块中的每个立方体,对于立方体的每个面,检查该方向上的相邻立方体(在块内。不要麻烦根据相邻块进行剔除)。如果相邻立方体存在,则剔除该面
换言之,您所做的是为特定块构建顶点数据数组。对于每个立方体,将向该阵列添加一定数量的顶点,基于该立方体的哪些面不会被剔除。因此,请检查6个相邻的立方体(同样,在同一块中),如果没有立方体,则为该面添加顶点。将焦点放在立方体而不是面上如何?也就是说,不要画与其他八个立方体接触的立方体的面。或者更精确,但可能更慢,不要绘制与其他立方体接触的面。对于块的每个面,如果其邻居是不透明块,则会剔除该面。我单独绘制每个面的原因是,如果它与另一个块接触,我可以关闭单个面,我只是不知道如何检测一个面是否与另一个块/面接触。对立方体进行空间排序,以便将立方体位置转换为其在数组中的索引。。。那么检查邻居的位置就很容易了。。。。二进制搜索是你的朋友。。。您甚至可以使LUT标记每个新行、列、片的开始索引,以进一步提高速度。如果你的世界很小或者你有大量的内存,你可以用3D纹理来存储你的世界。。。检查邻居位置很容易(在纹理坐标中只有+/-1 texel),请参见需要稀疏编码和/或BVH或Octtree@HeartUnder8lade:“对所有6个面重复”您是否真的将每个面放在自己的缓冲区对象中?忽略创建和使用这些微小缓冲区所带来的巨大内存开销,这意味着您需要为每个面使用一个新的渲染命令。那会毁了你的表演。
std::vector<glm::vec3> cubePositions;
int i = 0;
int chunkSize = 16;
int chunkVolume = chunkSize * chunkSize * chunkSize;
for (size_t j = 0; j < chunkSize; j++)
{
for (size_t k = 0; k < chunkSize; k++)
{
for (size_t h = 0; h < chunkSize; h++)
{
i++;
//order of h j k affect layers
cubePositions.resize(i + 1);
cubePositions[i] = { h, j, k };
}
}
}