6-2.顶点间共享法线
6-2.顶点间共享法线
问题
上一节,你学了如何给每个顶点提供法线数据使每个三角形被正确照亮。但是,盲目对一个对象的所有三角形应用这个方法将不会得到正确结果。如果给三角形每个顶点相同的法线方向,则每个顶点将被用同样的着色,致使三角形里所有像素也被同样的着色。
如果两个异面三角形像这样着色,一个三角形的所有像素将被同样着色,且另一个三角形的所有顶点将被不同的着色。这将可以很容易地看出它们之间的边界,因为这两个三角形最后得到一个不同的颜色。
你想要一个更好的结果使颜色从一个三角形渐变到另一个。也就是渐变着色。
解决方案
着色是由你的显卡为三角形的三个顶点做的计算,因为它们包含法线。从那里,着色是三角形内的所有像素的插值。如果一个三角形的三个顶点的所有法线都一样,所有三角形里的像素就被相同着色。如果不同,3个角落将不同着色,三角形里的像素也会平稳过度。
想象两个相邻三角形分享一个边,从6个顶点定义。如6-3.要使颜色从一个三角形渐变到另一个,你要确保每个边上的颜色相同。你可以做到这一点只有当我们拥有共有的顶点具有相同的法线,因此同样着色。6-3左边,顶点1和4有相同法线,顶点2和3有相同法线。

如何运作
本节,你将用2种方法定义2个三角形。首先,你将渲染2个三角形那么同一个三角形的所有顶点有相同的法线,导致一个三角形里所有像素将相等着色。接下来,你将确保共享顶点的法线相同,你将在三角形的边有平稳着色。
各自法线
这方法要找出垂直于三角形的方向并存储这个方向到它的每个顶点。下面代码定义6个顶点像6-3.每个三角形所有顶点有相同法线方向,垂直于三角形。左边三角形是positioned 垂直,所以它的法线指向左边。第二个三角形是positioned 水平,所以它的顶点指向上。
InitVertices(P529)
定义照亮最右边,但也有点下降的光,并单位化它为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();
结果方向将指向左和上的中间。接下来,在顶点定义中,各自的顶点用各自的法线,共享的顶点用共享的法线。现在渲染三角形你就会看到边缘的平稳过度了。

浙公网安备 33010602011771号