0

我目前正在使用 SharpGL 库编写一个 OpenGL 应用程序,并且我正在尝试简单地创建一组 3x3x3 的立方体,这些立方体排列在一个对称的网格中。我目前在下图中看到一些奇怪的行为:

缺少多维数据集

这让我完全被难住了,因为我看不出代码为什么会丢失最后 3 个块。负责创建多维数据集的方法如下所示:

private void CreateCube2(OpenGL gl, int cubeSize)
{
    gl.PushMatrix();
    const float spacing = 2.5f;

    for (int z = 0; z < cubeSize; z++)
    {
        for (int y = 0; y < cubeSize; y++)
        {
            for (int x = 0; x < cubeSize; x++)
            {
                var cube = new Cube();
                ColourCube(cube, cubeSize, x, y, z);
                cube.Render(gl, RenderMode.Render);

                gl.Translate(spacing, 0, 0);
            }
            gl.Translate(-spacing * cubeSize, spacing, 0);
        }
        gl.Translate(0, -spacing * cubeSize, spacing);
    }

    gl.PopMatrix();
}

其中 ColourCube 的定义如下:

private bool m_blackCubeMiddle = true;
private void ColourCube(Cube cube, int size, int x, int y, int z)
{
    cube.Faces[0].Material = (!m_blackCubeMiddle || y == 0) ? WhiteMaterial : BlackMaterial;     // Bottom
    cube.Faces[1].Material = (!m_blackCubeMiddle || y == size - 1) ? YellowMaterial : BlackMaterial;    // Top
    cube.Faces[2].Material = (!m_blackCubeMiddle || x == size - 1) ? GreenMaterial : BlackMaterial;     // Right
    cube.Faces[3].Material = (!m_blackCubeMiddle || x == 0) ? BlueMaterial : BlackMaterial;      // Left
    cube.Faces[4].Material = (!m_blackCubeMiddle || z == 0) ? OrangeMaterial : BlackMaterial;    // Front
    cube.Faces[5].Material = (!m_blackCubeMiddle || z == size - 1) ? RedMaterial : BlackMaterial;       // Back
}

整个项目可以从这里下载。

4

1 回答 1

0

奇怪的行为是由 SharpGL ' Polygon.Render ' 方法中的错误引起。它不是由您自己的代码引起的。当您在立方体上调用Triangulate时,它​​已经在屏幕上正确位置显示了 27 个立方体。但即便如此,SharpGL 还是错误地渲染了其中一个立方体。

在查看了 ShapGL 的 Cube & Polygon 类的源代码后,我建议您编写自己的立方体类。您现在使用的 Cube 类的实现从几个角度来看绝对是可怕的(GL_POLYGON(不推荐),立即模式顶点提交(不推荐))

在此处输入图像描述

于 2014-04-07T12:01:01.323 回答