Heath's Blog

There is no end, it is just the beginning! - A Game Developer's Notes

描边

    发现物体轮廓的一个简单方法就是使用N·V,其中N为法向量,V为顶点到眼睛(即摄像机)的向量。N·V度量了相对于当前视点表面的可见程度,当N·V是正值时一个点是可见的,而当N·V为负的时候这个点被隐藏。N·V接近0的点代表了从可见到隐藏的转变——这些点就是在或者接近物体的轮廓上的点,通过对一个1D纹理采样(简单情况下,只有黑白两个像素宽度,一个像素高度),可以得到类似于阶梯函数的效果,shader代码片段如下:

 float edge = max(dot(N , V) , 0);
 edge = tex1D(edgeSampler , edge);
 color = edge*color

    可以通过1D纹理的宽度来控制描边的粗细,如下图所示:


    通过if-else的形式给出过滤阀值也许更简单,但效果却没有纹理采样好。

posted on 2008-10-11 15:45 Heath 阅读(2061) 评论(4)  编辑 收藏 引用 所属分类: Graphics Programming

Feedback

# re: 描边 2008-10-11 18:31 陈梓瀚(vczh)

根据法向量搞的啊。以前见过另一种做法,好象是偏移了一下之后渲染两次求差。  回复  更多评论   

# re: 描边 2008-10-11 22:31 Heath

@陈梓瀚(vczh)
呵呵,Toon Shading的算法有很多种,用法向量和视向量来获得边界是一种相对比较简单的且计算量不大的方法。  回复  更多评论   

# re: 描边 2008-10-12 14:45 陈梓瀚(vczh)

但是用法向量的话,如果你纹理不够精密,或者物体本身不够【圆】,就失效了……

可以想象一下那玩意儿是一个立方体。  回复  更多评论   

# re: 描边 2008-10-13 10:13 Heath

@陈梓瀚(vczh)
此方法在针对有明显棱角的情况下,确实不能很好工作,有很多paper都提出了解决办法,比如采用图像处理提取轮廓就是其中一种。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理