如何在没有 GL_REPEAT 的情况下将精灵包裹在立方体周围?

How do I wrap a sprite around a cube without GL_REPEAT?

我正在使用 OpenGL 3.2+。我创建了一个包含 8 个顶点的立方体 VBO(每个顶点由 8 个浮点数组成:x、y、z、r、g、b、s、t),一个 EBO 用于为该立方体创建面,以及一个 VAO 将它们全部绑定在一起。

我有一个由数百个 16x16 精灵组成的精灵图集。我正在尝试从该图集中获取 1 个精灵以显示在立方体的所有侧面(任何方向都可以)。

通过调整 "s,t" 参数,我可以让 6 个面中的 4 个工作,但我似乎无法让最后 2 个面显示随机垃圾以外的任何东西。

我是否需要修改着色器以在图集上执行某种自定义 UV 环绕?

By tweaking the "s,t" parameters, I can get 4 of the 6 faces to work, but I can't seem to get the last 2 faces to show anything other than random garbage.

至少你必须为立方体的两条边使用单独的顶点和属性。这意味着您至少需要 8+2*2=12 组不同的顶点属性。

         x  y  z    u  v
0  :    -1  1  1    0  0
1  :     1  1  1    1  0
2  :    -1 -1  1    0  1
3  :     1 -1  1    1  1
4  :    -1 -1 -1    0  0
5  :     1 -1 -1    1  0
6  :    -1  1 -1    0  1 
7  :     1  1 -1    1  1
8  :    -1  1  1    1  1
9  :    -1  1 -1    1  0
10 :     1  1  1    0  1
11 :     1  1 -1    0  0

注意,索引为0、2、4和6的顶点属性集具有相同的u坐标0。索引为1、3、5和7的顶点属性集具有相同的u-坐标 1.
如果您想将纹理包裹成四边形,则必须改变 u 和 v 坐标。因此,您必须添加单独的顶点属性集 8、9、10 和 11。

注意,如果要添加垂直于立方体侧面的法向量,则需要24个顶点属性集。立方体的每边 4 个。