6-2.顶点间共享法线

6-2.顶点间共享法线

问题

上一节,你学了如何给每个顶点提供法线数据使每个三角形被正确照亮。但是,盲目对一个对象的所有三角形应用这个方法将不会得到正确结果。如果给三角形每个顶点相同的法线方向,则每个顶点将被用同样的着色,致使三角形里所有像素也被同样的着色。

如果两个异面三角形像这样着色,一个三角形的所有像素将被同样着色,且另一个三角形的所有顶点将被不同的着色。这将可以很容易地看出它们之间的边界,因为这两个三角形最后得到一个不同的颜色。

你想要一个更好的结果使颜色从一个三角形渐变到另一个。也就是渐变着色。

 

解决方案

着色是由你的显卡为三角形的三个顶点做的计算,因为它们包含法线。从那里,着色是三角形内的所有像素的插值。如果一个三角形的三个顶点的所有法线都一样,所有三角形里的像素就被相同着色。如果不同,3个角落将不同着色,三角形里的像素也会平稳过度。

想象两个相邻三角形分享一个边,从6个顶点定义。如6-3.要使颜色从一个三角形渐变到另一个,你要确保每个边上的颜色相同。你可以做到这一点只有当我们拥有共有的顶点具有相同的法线,因此同样着色。6-3左边,顶点14有相同法线,顶点23有相同法线。

 

 

如何运作

本节,你将用2种方法定义2个三角形。首先,你将渲染2个三角形那么同一个三角形的所有顶点有相同的法线,导致一个三角形里所有像素将相等着色。接下来,你将确保共享顶点的法线相同,你将在三角形的边有平稳着色。

 

各自法线

这方法要找出垂直于三角形的方向并存储这个方向到它的每个顶点。下面代码定义6个顶点像6-3.每个三角形所有顶点有相同法线方向,垂直于三角形。左边三角形是positioned 垂直,所以它的法线指向左边。第二个三角形是positioned 水平,所以它的顶点指向上。

 

InitVerticesP529

 

定义照亮最右边,但也有点下降的光,并单位化它为1

 

Vector3 lightDirection = new Vector3(10,-2,0);

lightDirection.Normalize();

basicEffect.DirectionalLight0.Direction = lightDirection;

 

接下来,渲染每个三角形:

 

basicEffect.Begin();

foreach(EffectPass pass in basicEffect.CurrentTechnique.Passes)

{

   Pass.Begin();

   Device.VertexDeclaration = myVertexDeclaration;

   Device.DrawUserPrimitives<VertexPositionNormalTexture>

(PrimitiveType.TriangleList,vertices,0,2);

Pass.End();

}

basicEffect.End();

 

你会看见2个有固块颜色的三角形,如6-4.由此,你可以很容易看到它们间的边。这绝对不是你想要的。

 

 

共享法线

     要得到平稳的效果,你将简单的代入法线的平均值。代码如下:

    

Vector3 normal1 = new Vector3(-1,0,0);

     Vector3 normal2 = new Vector3(0,-1,0);

     Vector3 sharedNormal = normal1 + normal2;

     sharedNormal.Normalize();

 

结果方向将指向左和上的中间。接下来,在顶点定义中,各自的顶点用各自的法线,共享的顶点用共享的法线。现在渲染三角形你就会看到边缘的平稳过度了。

posted @ 2009-09-21 15:27  conglele  阅读(892)  评论(0)    收藏  举报