2011-09-02 67 views
4

我想使用顶点数组来绘制一个相当大的网格,其中包含大量的顶点。纹理已经从这些决定,这是很容易在即时模式下绘制的线沿线:在OpenGL中结合顶点数组和纹理

glBegin(GL_TRIANGLES) { 
    for (int faceIdx = 0; faceIdx < nFaces; ++faceIdx) 
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]); 
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]);  
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]); 
    } 
} 
glEnd(); 

但是为了可读性,速度和我想用顶点数组(以期剩下的移动到维也纳组织)。有没有办法多次将单个顶点放入数组中?

据我了解,目前有必要指定网格的每个顶点的次数,因为它出现在网格的一个面上,因为每个顶点都标识为多个纹理坐标(纹理是从实时图像中捕获的,网格近似的对象的世界图像),即我的顶点/ tex坐标数组读取就好像我在即时模式下填充它。

是否有任何方式使用顶点数组,同时指定纹理坐标,而不使用冗余(我指的是重复的)顶点?

+0

几天前我问了一个(远程)类似的问题:http://stackoverflow.com/questions/7232915/fewer-colors-than-vertices –

+1

我在上面的代码中看不到您的问题。顶点位置和纹理坐标可以共享索引,但是您正在使用每个顶点前进索引。顺便说一句,我认为你得到的调用顺序搞砸了:在所有其他属性设置完成后调用glVertex。在glBegin中... glEnd块最后一个OpenGL命令应该是glVertex – datenwolf

回答

5

单个顶点由组成该单个顶点的所有属性组成。因此,共享相同位置但具有不同纹理坐标的两个顶点在概念上是不同的顶点。所以不行,围绕不同的texCoords重复顶点位置没有简单的方法。

但是通常这样的顶点重复仅仅在一些稀有区域是必要的(比如锋利的边缘,因为不同的法线,或者像你的情况纹理接缝)。所以你所有的面孔的角落真的有不同的texCoords?也许你可以预先处理你的数据,并找到相邻的面共享位置 texCoords,因此可以共享顶点。如果许多顶点不是这种情况,那么我会感到惊讶,并且最终只有一小堆重复的顶点。

+0

Thankyou - 其中一个'很高兴有答案,但希望这是一个不同'的情况。然而,它完全有道理 - 我只需要看看按摩纹理文件以限制重复。 – northerncodemonkey

-1

如果我理解你的问题是正确的,那么确实有办法摆脱必须将多个相同顶点放入顶点缓冲区的方法。您可以使用索引缓冲区并使用索引来指定相同的顶点。这可以显着提高渲染速度。

+0

感谢您的快速回答,但问题是网格中的单个顶点可以对应多个(例如3个)纹理坐标。将纹理排除在等式之外,我们确实可以使用索引绘图,但是如果顶点A出现在2个面中,因此在我们的与2(s,t)对相对应的纹理方案中,似乎没有办法使用索引绘图来实现此目的因为我们无法指定所需的多个(s,t)对。 – northerncodemonkey