Странное горное поколение, похожее на майнкрафт - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь реализовать игру, похожую на майнкрафт, используя opengl. Итак, я дошел до того, что хочу заменить глупое поколение sh на отбраковку.

Вид местности без выбраковки между кусками: img

Просмотр внутри местность: img

Это работало нормально, но когда я пытаюсь также отбирать эти блоки между кусками, вещи go странные.

Вид местности при добавлении отбраковки между кусками: img

Вот код моего sh генерации:

void Chunk::CreateMesh()
{
    for (int x = 0; x < CHUNK_SIZE; x++)
    {
        for (int y = 0; y < CHUNK_SIZE; y++)
        {
            for (int z = 0; z < CHUNK_SIZE; z++)
            {
                BlockType currentBlock = blocks[x][y][z];
                BlockChunkPosition currentPos(x, y, z);
                if (currentBlock != BlockType::AIR)
                {

                    // Right face
                    if (GetBlock(x + 1, y, z) == BlockType::AIR || GetBlock(x + 1, y, z) == BlockType::LEAVES)
                    {
                        mesh.AddFace(RIGHT_FACE, currentBlock, currentPos);
                    }

                    // Left face
                    if (GetBlock(x - 1, y, z) == BlockType::AIR || GetBlock(x - 1, y, z) == BlockType::LEAVES)
                    {
                        mesh.AddFace(LEFT_FACE, currentBlock, currentPos);
                    }

                    // Top face
                    if (GetBlock(x, y + 1, z) == BlockType::AIR || GetBlock(x, y + 1, z) == BlockType::LEAVES)
                    {
                        mesh.AddFace(TOP_FACE, currentBlock, currentPos);
                    }

                    // Bottom face
                    if (GetBlock(x, y - 1, z) == BlockType::AIR || GetBlock(x, y - 1, z) == BlockType::LEAVES)
                    {
                        mesh.AddFace(BOTTOM_FACE, currentBlock, currentPos);
                    }

                    // Front face
                    if (GetBlock(x, y, z + 1) == BlockType::AIR || GetBlock(x, y, z + 1) == BlockType::LEAVES)
                    {
                        mesh.AddFace(FRONT_FACE, currentBlock, currentPos);
                    }

                    // Back face
                    if (GetBlock(x, y, z - 1) == BlockType::AIR || GetBlock(x, y, z - 1) == BlockType::LEAVES)
                    {
                        mesh.AddFace(BACK_FACE, currentBlock, currentPos);
                    }


                }
            }
        }
    }
}
BlockType Chunk::GetBlock(int x, int y, int z)
{
    try
    {
        return blocks.at(x).at(y).at(z);
    }
    catch (std::out_of_range &)
    {
        BlockWorldPosition pos = ToWorldCoordinates(position, BlockChunkPosition(x, y, z));
        return terrain->GetBlock(pos);
    }
}

BlockType Terrain::GetBlock(BlockWorldPosition pos)
{
    ChunkPosition chunkPos;
    chunkPos = GetChunkPos(pos);

    BlockChunkPosition blockPos;
    blockPos = GetBlockLocalPos(pos);


    ChunkTable::iterator currentChunk;
    if(((currentChunk = chunks.find(chunkPos)) != chunks.end()))
    {
        return currentChunk->second->GetBlock(blockPos.x, blockPos.y, blockPos.z);
    }
    return BlockType::AIR;
}

Когда я использую отладчик, он странным образом работает в блоке try-catch. Что-то не так?

Что может вызвать такую ​​проблему?

1 Ответ

0 голосов
/ 24 января 2020

Наконец я нашел проблему. Эта проблема возникла из-за того, что я несколько раз связывал буфер вершин и индексов, когда это было не нужно. К массиву vetrex уже были привязаны буферы.

void ChunkMesh::GenerateMesh()
{
    ibo.Bind();
    vbo.Bind();
    vao.Bind();
    vbo.GenerateBuffer(sizeof(float) * mesh.size(), &mesh[0]);
    ibo.GenerateBuffer(indices.size(), &indices[0]);
    vao.AddBuffer(vbo, layout);
}

заменен на

void ChunkMesh::GenerateMesh()
{
    vao.Bind();
    vbo.GenerateBuffer(sizeof(float) * mesh.size(), &mesh[0]);
    ibo.GenerateBuffer(indices.size(), &indices[0]);
    vao.AddBuffer(vbo, layout);
}

И

void ChunkMesh::Render()const
{
    ibo.Bind();
    vao.Bind();
    shader.Bind();
    GLCall(glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0));
}

Я заменен на

void ChunkMesh::Render()const
{
    vao.Bind();
    shader.Bind();
    GLCall(glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0));
}

Хотя я до сих пор не до конца понимаю, почему это произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...