1

我正在尝试创建一个完全基于完全相同大小的立方体的 3 维游戏。我想学习如何仅使用 2 维游戏库制作自己的 3 维游戏。目前,我正在做的事情是我有一个数组来存储游戏中每个立方体的所有中心的位置。然后,在绘制单个立方体时,我会确定需要绘制立方体的哪 3 个面(因为您不需要绘制立方体的所有 3 个面)。然后,知道立方体所有角的 3 维点,我使用相机位置、相机角度和我正在投影的点将这些点投影到 2 维空间。

现在我真正的问题是:既然我可以绘制单个立方体,我如何绘制多个立方体,考虑到立方体需要按一定的顺序绘制(即需要先绘制更远的立方体,以便立方体离我们更近的出现在离我们很远的立方体的顶部)?给定立方体中心列表及其大小以及相机位置/角度,如何确定首先绘制哪些立方体?

4

1 回答 1

2

我学习3D图形已经好几年了...

我使用的所有网站现在都消失了(像往常一样在 WEB 上,但有很多新网站)。我是OpenGL用户,所以我建议使用它。我的许多学生都喜欢NEHE教程,所以请看这里。另请查看 4x4 变换矩阵(齐次坐标)。

Z-Buffer在OpenGL中是自动的,只需使用Z-Buffer创建上下文(所有教程都使用它)并调用glEnable(GL_DEPTH_TEST);

面剔除(跳过对象的另一侧)是通过glEnable(GL_CULL_FACE);在同一多边形缠绕(CWCCW)中绘制面来完成的

这里有几个相关的问题:

还有一些值得一看的好网站(强烈推荐):

对不起,链接列表,但我认为他们是相关的,在这里复制他们的东西会太多。现在回到你的问题如何渲染更多的立方体。我看到几个选项(在 OpenGL 中):

  1. 每个立方体都有自己的变换矩阵

    然后在渲染每个立方体更改GL_MODELVIEW矩阵和绘制立方体之前表示其在空间中的位置和方向(每个都使用相同的代码)。如果你有太多的对象/多维数据集,它将消耗大量内存(每个多维数据集 +16 个浮点数)。

  2. 每个立方体都相互对齐

    在这种情况下,您只需要知道 3D 位置(每个立方体 +3 个浮点数),所以只需执行以下操作:

    glMatrixMode(GL_MODELVIEW);    // this store original matrix
    glPushMatrix();
    glTranslatef(x[i],y[i],z[i]); // position of i-th cube
    // here render cube (like glBegin(GL_QUADS); ... or use glDraw... )
    glMatrixMode(GL_MODELVIEW);    // this restore original matrix
    glPopMatrix();
    
  3. 着色器的使用

    在现代着色器管道中,您可以使用几何着色器在接收点发射立方体,但这对于 OpenGL 初学者来说太多了。但在这种情况下,您将只绘制点,着色器会将它们转换为 GPU 上的立方体,这要快得多......

  4. 使用 VBO 或 VAO

    • VAO是顶点数组对象(VBO 的列表)
    • VBO是顶点缓冲对象


    VBO基本上是作为一个块复制到GPU的一组参数,而不是像 ... 这样的单独调用glVertex,glColor,glNormal,这要快得多。这允许您创建空间模型(所有立方体)并以足够的速度一次绘制它,除非您达到GPU/CPU/MEM速度限制

    VAO同样将更多的VBO组合在一起,因此您只需为每个对象绑定一个VAO ,而不是为每个参数绑定一个VBO ,从而进一步减少渲染所需的 API 调用次数。

于 2014-04-10T07:28:23.523 回答