发现物体轮廓的一个简单方法就是使用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的形式给出过滤阀值也许更简单,但效果却没有纹理采样好。