§8.5挑战:编写Edge Detection Shader(边缘检测着色)

本章对post-screen shade已经谈论了很多了,涵盖几乎所有的基本post-screen shade。你学习了通过基本组件编写类似的shader。举例来说,色彩校正shader可用于实现如图8-1中的灰度效果。Edge Detection Shader我故意留着没写。它可能不是每个游戏都用到,但有许多其他shader使用了边缘检测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的效果。

图8-24


发布时间:2008/9/25 下午4:04:45  阅读次数:7918

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号