gpt4 book ai didi

c++ - 从三角形网格及其轮廓中提取锐边并使用 openGL 进行渲染

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:03 44 4
gpt4 key购买 nike

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

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

在搜索过程中,我偶然发现了 CGAL、half-edges、OpenMesh,但没有任何使用经验。

我的问题是:
如何确定锐边?或者遍历网格,创建邻接表并测试所有边? (叉积得到面法线和点积得到它们之间的角度)
如何以一种好的方式存储它,以便以后能够轻松渲染它?为钝边创建退化三角形?这样会丢失太多信息吗?使用存储线条并绘制它们的格式?然后如何渲染它们?

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

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

最佳答案

如果我没记错的话,锋利的边缘总是取决于观点。您必须有一个“观点”来决定法线是指向前面还是后面。

这就是它经常在几何着色器中完成的,而不是只在 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

关于c++ - 从三角形网格及其轮廓中提取锐边并使用 openGL 进行渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36179911/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com