§8.5挑战:编写Edge Detection Shader(边缘检测着色)
本章对post-screen shade已经谈论了很多了,涵盖几乎所有的基本post-screen shade。你学习了通过基本组件编写类似的shader。举例来说,色彩校正shader可用于实现如图8-1中的灰度效果。Edge Detection Shader我故意留着没写。它可能不是每个游戏都用到,但有许多其他shader使用了边缘检测shader的基本功能。下面是一些例子:
- 边缘检测shader可以表现出一种异形的视觉效果,或类似高科技特殊操作的视觉模式,使您可以在夜间看得更清晰。
- 漫画和卡通渲染,只是将输入的颜色减少到非常少的颜色,例如通过颜色盘或简单的图像,把贴图上的颜色映射到某些预定的颜色,接着为每个三维表面绘制粗线边缘,通过边缘检测shader很容易做到。您还可以通过画三维线条,然后在顶部加上几何体,只留下每一个三维物体的轮廓去改善效果,使用边缘检测shader也很容易实现。
- 边缘检测shader可以用来增加场景的对比度或找到线条或轮廓。边缘检测往往与模糊效果相反,模糊效果将一切都混合在一起,有时会使最后的结果失去太多细节。如果您想要开始前做更多的辉光和模糊的效果,边缘检测shader可以帮你获得一个比较锐利的图像。
- 边缘检测shader也可以被用来创造看起来像画出来的图片。您只需使用非常高的边缘检测值并添加一个如图8-1一样的half-tone shader。
您要做的就是创建一个简单的边缘检测过滤器。基本思路是从原来的场景贴图中提取若干像素,并与邻近的像素比较。在Shader Model 1.1中,您只能提取四个纹理像素,在Shader Model 2.0可以有8个,因此,你能使用的像素是有限的。在Pixel Shader 1.1中与邻近像素比较不容易效果也不好。你可以只取一个中心点,把它乘以2,然后减去两个周围的点(顶部和底部,或左边和右边),然后在Luminance函数结果的帮助下采用灰度值,去实现边缘效果。
以下是基本的Pixel Shader代码,如果是Shader Model 2.0,您可以做更多的纹理提取。如果您不能确定如何扩展shader请在Nvidia的FX Composer中检查边缘shader。你应该在FX Composer中完成整个shader,然后就可以通过C#类将其导入到您的引擎中。变量col1,col2,col3和col4从场景贴图的四个纹理坐标中提取的,然后将它们传递给Pixel Shader。
return Luminance(
// Horizontal
(col1*2.0f-col2-col3)+
// Vertical
(col2*2.0f-col1-col4));
如果shader正常应该可以看类似图8-24的效果。
发布时间:2008/9/25 下午4:04:45 阅读次数:8448