6-3.添加高细节到光源:每像素光照

6-3.添加高细节到光源:每像素光照

问题

前两节中,着色值在每个顶点中计算,这值是三角形所有顶点的插值。因此,这叫每顶点光照(高氏着色)。许多情况,这不会得到最好的结果。特别当用在大三角形和/或尖锐边缘,这将得到不希望的结果。

考虑立方体的三个面,如6-5.图像右面指示如何定义共享的法线方向。光照方向由右边部分的顶部的4个箭头指示。

 

 

着眼于立方体的顶部,对应6-5右部的顶点2和顶点4之间的线。使用每顶点光照,着色依照顶点24计算的。在顶点4,没有收到多少光线,因为顶点4的法线几乎垂直于光的方向。说它是百分之二十照亮。顶点2接收更多光,因为它法线方向几乎和光方向相同;让我们说它是百分之80照亮。在每顶点着色,这着色是用插值替换三角形的像素,这两个顶点间的像素接收的光线值在80%20%之间.也就是说,没有像素能100%照亮。

但是,顶点24间的某处像素的法线完全沿着光的方向!这个法线在6-5中指出了。毫无疑问,这个像素被100%照亮,当用每顶点光照像素只能接收80%20%的光。

 

解决方案

每顶点光照计算着色精确只在顶点且当然后插值来着色顶点之间所有像素。用每像素光照,你给所有像素插入法线,允许你计算每个像素的精确着色。

 

如何运作

     BasicEffect,很容易使用每像素着色。当设置参数时,简单添加如下行:

 

     basicEffect.PreferPerPixelLighting = true;

 

注意 为了每像素着色可以工作,你要有最低支持Shader 2.0的显卡。可以用下面一行测试:

GraphicsDevice.GraphicsDeviceCapabilities.MaxPixelShaderProfile >= ShaderProfile.Ps_2_0

posted @ 2009-09-21 18:29  conglele  阅读(405)  评论(0)    收藏  举报