2012-01-03 105 views
2

我试图渲染一个纹理映射的立方体,作为我自学成才(或者说是SO教学)学习的一部分。将顶点索引和纹理坐标结合在一起

我发现this example网上说包顶点COORDS和纹理COORDS成一个阵列,像这样:

Vertex Vertices[4] = { Vertex(Vector3f(-1.0f, -1.0f, 0.5773f), Vector2f(0.0f, 0.0f)), 
         Vertex(Vector3f(0.0f, -1.0f, -1.15475), Vector2f(0.5f, 0.0f)), 
         Vertex(Vector3f(1.0f, -1.0f, 0.5773f), Vector2f(1.0f, 0.0f)), 
         Vertex(Vector3f(0.0f, 1.0f, 0.0f),  Vector2f(0.5f, 1.0f)) }; 

我想它为一个金字塔形的对象,但它不工作这么好我的魔方。问题是我需要为与另一个面共享的同一个顶点使用不同的纹理坐标。所以我想,“哦,我知道!我只是将纹理坐标与索引打包在一起!”我快速创建了我的数据结构,将索引映射到纹理坐标,但现在我遇到了一个障碍:索引需要进入GL_ELEMENT_ARRAY_BUFFER,并且纹理坐标需要进入GL_ARRAY_BUFFER

这是否意味着我无法将这些数据打包到一个缓冲区中?我必须将索引数组和纹理坐标数组拆分为两个单独的结构?此外,我只是意识到,顶点位置和纹理坐标之间不再有1:1映射......我不知道如何重写我的顶点着色器。

还是我应该按照教程的方式来做(将顶点位置和纹理坐标放在一起),并在必要时重复顶点?

我认为首先分离索引和顶点位置的整个想法是减少数据冗余,但是现在我必须在我想使用纹理后立即添加冗余?

回答

1

你因为一个常见的误解而认识到,只用他们的位置来标识顶点。不过,这不是顶点。

实际上,顶点是所有属性的完整组合,即位置,法线,纹理坐标。所以如果纹理坐标不同,你有一个非常不同的顶点,它有自己的索引。所以你必须复制位置,正常等数据,除了不同的纹理坐标。

+0

不够公平......我可以接受这个事实:) – mpen 2012-01-03 02:06:41