我正在分析一个模糊的OpenGL应用程序。我想要生成一个.obj
文件,它描述了应用程序中显示的多多边形模型。
因此,我冻结了应用程序,并挖掘了VBO和IBO中设置的值。但是IBO中设定的值比我预期的要神秘得多。其价值是
0、0、1、2、3、4、5、6、7、7、5、8、3、3、9、9、10、11、12、12、10、13、14、14、10、15、16、16、17、17、7、8、8、18、18、19、20、21、21、22、22、23、24、25、25、26、26、27、28、29、29、30、30、31、32、32、33、33、34、35、36、37、38、38、36、39、34、34、40、40、40、41、42、43、44、44、45、45、46、47、48、49、49、50、50、51、52、52、53、53、54、55、55、56、56、57、58、58、59、59、60、61、62、62、63、63、64、65、66、67、64、68、68、69、69、70、71、72、73、74、75、76、76、77、77、77、78、79、80、81、82、82、80、83、83、84、84、85、86、87、88、88、89、89、90、91、91、92、92、93、94、95、96、96、97、97、97、98、99、100、101、102、102、100、103、103、104、104、105、106、107、107、108、108、108、109、110、111、112、112、100、100、101、113、114、114、(length=10495)
如您所见,40
、63
、92
和108
等索引是三倍的,因此,将GL_TRIANGLES
、GL_TRIANGLE_STRIP
、GL_TRIANGLE_FAN
、GL_QUADS
、GL_QUAD_STRIP
或GL_POLYGON
设置为glDrawElements
都不能正常工作。
在IBO中是否有使用三重排序索引的先进技术?什么意思?它的用途是什么?
发布于 2017-10-01 15:26:09
像这样的重复指数表明三角形条的优化是积极的。重复索引创建退化三角形:具有零面积的三角形。由于它们没有可见区域,因此不会呈现。它们存在,这样您就可以从一个三角形条跳转到另一个三角形条,而不必发出另一个绘图命令。
因此,双索引通常用于将两条条缝合在一起。它生成的两个三角形将不会呈现。
然而,由于带材按卷绕顺序工作。的方式,三角形的表面可能会不正确地计算出来。也就是说,如果你用双指数将两条条缝合在一起,那么第二条条就会从它想要的反向缠绕顺序开始。
这就是三重指数出现的原因。第三个索引为目标条中的三角形确定缠绕顺序。它生成的三个额外三角形将不会呈现。
在同一个绘图调用中处理多条条的更现代的方法是使用原始重启指数。但是,目前的索引列表已经足够用于GL_TRIANGLE_STRIP
了。
您可以很容易地阅读这个条形列表并将其处理成一系列独立的三角形(适合于GL_TRIANGLES
)。只需查看每个序列的3个顶点,并输出到您的三角形缓冲区,只要它不是一个退化三角形。对于每一个奇数三角形,你必须颠倒两个指数的顺序。代码应该如下所示:
const int num_faces = indices.size() - 2;
faces.reserve(num_faces);
for(auto i = 0; i < num_faces; ++i)
{
Face f(indices[i], indices[i + 1], indices[i + 2]);
//Don't add any degenerate faces.
if(!(f[0] == f[1] || f[0] == f[2] || f[1] == f[2]))
{
if(i % 2 == 1) //Every odd-numbered face.
std::swap(f[1], f[2]);
faces.push_back(f);
}
}
https://stackoverflow.com/questions/46511972
复制相似问题