从三角形网格及其轮廓中提取锐边,并使用openGL

时间:2016-03-23 13:43:48

标签: c++ opengl mesh edge

我尝试以线框样式渲染openGL(3.3)中的对象,但只有它的锐边(即相邻面法线具有一定的delta角)及其轮廓/轮廓/边界。我的数据结构是一个三角形网格,只存储三角形及其顶点。 我调查了"Hardware Determined Edge Features" by Morgan McGuire and John F. Hughes"Hardware Generated Object Silhouettes" by Michal Valient 两者都在线计算edge / face-normals / silhouettes,这就是为什么他们都必须实现一些"解决方法"能够使用GPU进行边缘确定。

我认为最好确定一旦锐边离线并以某种方式存储此信息以便以后渲染并根据视点在线确定对象的轮廓/轮廓/边界。

在我的搜索过程中,我偶然发现了CGAL,半边缘,OpenMesh,但没有任何使用它的经验。

我的问题是:
如何确定锋利的边缘?或者浏览网格,创建邻接列表并测试所有边缘? (交叉产品得到面法线和点积来得到它们之间的角度)
如何以良好的方式存储它,以便以后能够轻松地呈现它?为暗淡边缘创建退化三角形?有太多的信息会以这种方式丢失吗?使用存储行的格式,并绘制它们? 如何渲染它们?

如何在线确定轮廓/轮廓?

这是一个广泛的问题,但我希望有人可以指导我一个方向,或者甚至可以在之前提到过一个提到的库(CGAL,OpenMesh)。

1 个答案:

答案 0 :(得分:2)

如果我没错,锋利的边缘总是取决于观点。你必须有一个“观点”来决定一个法线正面向前或向后倾斜。

这就是它经常在几何着色器中完成而不是只在CPU上执行一次(如果你想移动相机则无法工作)。

对于几何着色器技术,您需要发送三角形+它们的邻接。这只能使用halfedges结构计算一次(快速简便的方法),或者你可以有一个像

这样的循环
for each triangle t1
    for each triangle t2
        if t2 has 2 indices common with t1 then
            add t2 to t1 adjacency list
        endif
    endfor
endfor

然后使用此信息构建索引列表(您将发送到GPU),这可能看起来像

for each triangle t1
    indexList.append(t1.a, t1.b, t1.c)
    for each triangle t2 in t1 adjacency
        idx = find the index not common with t1
        indexList.append(idx)
    endfor
endfor