Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从立方体阵列中删除内部面的最佳方法是什么?_C++_Opengl_Visual C++_Opengl 4 - Fatal编程技术网

C++ 从立方体阵列中删除内部面的最佳方法是什么?

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

我正在尝试用opengl创建一个看起来很像的Minecraft,并且已经到了可以绘制聚集在一起的立方体“块”的地步。然而,我似乎找不到一个好方法来移除多维数据集中所有看不见的面(一个16x16x16的多维数据集)

我已经为一个立方体创建了基本的基础设施(所有面坐标彼此分离),然后复制所有立方体信息并使用glm::translate和DrawVertexArray绘制

e、 g:背面

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 };
        }
    }
}