我目前正在使用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
}
整个项目可以从here下载 .
1 回答
奇怪的行为是由SharpGL'Polygon.Render'方法中的错误引起的 . 它不是由您自己的代码引起的 . 当你在立方体上调用Triangulate时,它已经在屏幕上以正确的位置显示了27个立方体 . 但即便如此,SharpGL也错误地渲染了其中一个立方体 .
看过ShapGL的Cube&Polygon类的源代码后,我建议编写自己的多维数据集类 . 您现在使用的Cube类的实现从几个角度来看是绝对可靠的(GL_POLYGON(不建议使用),立即模式顶点提交(不建议使用))