4

我正在尝试在立方体上映射纹理,该立方体基本上是具有 8 个顶点和 14 个标记的三角形条带:

static const GLfloat vertices[8] =
{
    -1.f,-1.f,-1.f,
    -1.f,-1.f, 1.f,
    -1.f, 1.f,-1.f,
    -1.f, 1.f, 1.f,
     1.f,-1.f,-1.f,
     1.f,-1.f, 1.f,
     1.f, 1.f,-1.f,
     1.f, 1.f, 1.f
};

static const GLubyte indices[14] =
{
    2, 0, 6, 4, 5, 0, 1, 2, 3, 6, 7, 5, 3, 1
};

如您所见,它开始用 4 个索引绘制背面2, 0, 6, 4,然后用 3 个索引绘制底部,5, 0, 1然后仅从1, 2, 3三角形开始,左侧3, 6, 7是三角形,顶部是三角形,依此类推...

我有点迷失如何在这个立方体上映射纹理。这是我的纹理(你明白了):

立方体纹理

我设法使背面纹理化,并且可以以某种方式在前面添加一些东西,但是其他 4 个面完全搞砸了,我有点困惑着色器如何处理与纹理坐标有关的三角形。

我能做到的最好的是:

我的奴才立方体

您可以清楚地看到侧面的三角形。这些是我的纹理坐标:

static const GLfloat texCoords[] = {
    0.5, 0.5,
    1.0, 0.5,
    0.5, 1.0,
    1.0, 1.0,
    0.5, 0.5,
    0.5, 1.0,
    1.0, 0.5,
    1.0, 1.0,
    // ... ?
};

但是每当我尝试添加更多坐标时,它完全是在创造一些不同的东西,我无法解释为什么。知道如何改进吗?

4

1 回答 1

7

您遇到的心理障碍是假设您的立方体只有 8 个顶点。是的,只有 8 个取芯器位置。但是与该角相邻的每个面显示图像的不同部分,因此在该角具有不同的纹理坐标。

顶点是元组

  • 位置
  • 纹理坐标
  • …</li>
  • 您可以提出的任何其他属性

只要其中一个属性发生变化,您就会处理一个完全不同的顶点。这对您来说意味着您正在处理 8 个角位置,但每个角有 3 个不同的顶点,因为在该角处有具有不同纹理坐标的相遇面。所以你实际上需要 24 个顶点组成 6 个不同的面,这些面根本不共享顶点。

为了让初学者更容易,不要将顶点位置和纹理坐标放入不同的数组中。而是这样写:

struct vertex_pos3_tex2 {
     float x,y,z;
     float s,t;
} cube_vertices[24] =
{
    /* 24 vertices of position and texture coordinate */
};
于 2014-08-26T10:52:14.317 回答