NPR的一些想法
实在是为了填补空虚无聊的感觉,又拿起以前研究过的东西。每每觉得过一阵子回头看从前的东西都会有新的体会(不限于这里说的些雕虫小技),或许这是件好事吧?
silhouette检测方面,之前觉得暴力搜索已经足够了,其实根据帧间一致性,加上一些特性如小于某一阈值的边间夹角,可以从大量的三角形中筛选出candidates,将其作为种子进行搜索,效率会高很多(号称)。
再说在检测的同时,应该顺着搜索出的silhouette edge为线索,在邻边或者邻面中查找,生成出一条连续的path,可以是屏幕坐标系也可以是世界坐标系。以前自己总结出这条经验时,总觉得一定需要深度优先搜索就要递归什么的,现在想想当时是想复杂了,最终我不需要traceback费那么大劲操作栈干吗……总之这条path的生成和之后的parameterization是密不可分的。
而silhouette edge的定义也可以更精准。以前的定义是边相邻的两个面的n dot v的值符号相反,即为silhouette edge。但实际上真正的silhoutte edge应该是所有n dot v == 0的地方。而polygon approximation的模型即使再多的面也只能逼近原模型,所以光查找n dot v == 0会基本上找不到边(囧)。所以有插值概念。做法是:不以面法线为数据源,而是以顶点法线为数据源,记录一个面上3个顶点的n dot v,如果符号不是全部相同,那么必定有一条silhoutte edge穿过三角形的2条边,到达邻接的三角形中。这样,silhoutte edge成了silhoutte contour,是定义在三角形面上的一条segment。这条segment最终可以连成一个环(!仔细考虑)。具体这条segment两个endpoints的位置,就根据3个n dot v的结果和三角形顶点的位置,插值计算吧。
silhouette path的可见性也是很大的问题。我看好像大家都在使用ID reference buffer,将mesh和silhouette都渲染到这个buffer中,让zbuffer来解决可见性。之后需要readback(最大的瓶颈),然后将上面所说的检测有效的silhouette,一个个光栅化,光栅化的同时和ID reference buffer中的颜色进行比较,获得实际上的可见部分。
还有一点要说的是crease edge,过去由于种种原因没有去重视它。实际上它可以被预计算(view independent),只要两个面的夹角大于某个阈值即可记录为crease edge。crease edge在表现物件的细节方面还是很重要的,尤其是如果你还想用虚线表示不可见的物件细节时,没有crease edge会非常尴尬(jot的tutorial 2)。
以上。
silhouette检测方面,之前觉得暴力搜索已经足够了,其实根据帧间一致性,加上一些特性如小于某一阈值的边间夹角,可以从大量的三角形中筛选出candidates,将其作为种子进行搜索,效率会高很多(号称)。
再说在检测的同时,应该顺着搜索出的silhouette edge为线索,在邻边或者邻面中查找,生成出一条连续的path,可以是屏幕坐标系也可以是世界坐标系。以前自己总结出这条经验时,总觉得一定需要深度优先搜索就要递归什么的,现在想想当时是想复杂了,最终我不需要traceback费那么大劲操作栈干吗……总之这条path的生成和之后的parameterization是密不可分的。
而silhouette edge的定义也可以更精准。以前的定义是边相邻的两个面的n dot v的值符号相反,即为silhouette edge。但实际上真正的silhoutte edge应该是所有n dot v == 0的地方。而polygon approximation的模型即使再多的面也只能逼近原模型,所以光查找n dot v == 0会基本上找不到边(囧)。所以有插值概念。做法是:不以面法线为数据源,而是以顶点法线为数据源,记录一个面上3个顶点的n dot v,如果符号不是全部相同,那么必定有一条silhoutte edge穿过三角形的2条边,到达邻接的三角形中。这样,silhoutte edge成了silhoutte contour,是定义在三角形面上的一条segment。这条segment最终可以连成一个环(!仔细考虑)。具体这条segment两个endpoints的位置,就根据3个n dot v的结果和三角形顶点的位置,插值计算吧。
silhouette path的可见性也是很大的问题。我看好像大家都在使用ID reference buffer,将mesh和silhouette都渲染到这个buffer中,让zbuffer来解决可见性。之后需要readback(最大的瓶颈),然后将上面所说的检测有效的silhouette,一个个光栅化,光栅化的同时和ID reference buffer中的颜色进行比较,获得实际上的可见部分。
还有一点要说的是crease edge,过去由于种种原因没有去重视它。实际上它可以被预计算(view independent),只要两个面的夹角大于某个阈值即可记录为crease edge。crease edge在表现物件的细节方面还是很重要的,尤其是如果你还想用虚线表示不可见的物件细节时,没有crease edge会非常尴尬(jot的tutorial 2)。
以上。