您的位置:首页 > 其它

[翻译]XNA 3.0 Game Programming Recipes之forty

2009-08-11 16:19 211 查看
PS:自己翻译的,转载请著明出处格
6-4 添加镜子的高亮光到反射表面问题
即使对per-pixel阴影的启用,你绘制的一些金属或者有光泽的物体仍然看上去有点阴暗。在真实生活中,当观察一个反射表面如一个金属,玻璃,或者一些塑料,你会看到有些地方光源反射非常的亮。这样一个地方正如图6-6中的圆圈所表示的。这些亮点被称为specular highlights。


解决方案
正如一个per-pixel光照,你可以简单的启用镜面高光通过告诉BasicEffect去创建它们。
注意:镜面高光应该只添加到反射材质上。不要添加它们到柔软材质如衣服或者一个草的材质,或至少使他们的影响非常微弱。
它是如何工作的
你可以启用镜面高光突出极端易于使用的BasicEffect.每一个光,你可以指定镜子的颜色。接下来,你可以设置镜子的强度在BasicEffect中。这个强度允许你去指定你的高光的宽度。强度越强,你的镜面高光就会越窄。参看6-8节得到更多细节。
1 basicEffect.LightingEnable=true;
2 basicEffect.DirectionalLight0.Direction=lightDirection;
3 basicEffect.DirectionalLight0.DiffuseColor=Color.White.ToVector3();
4 basicEffect.DirectionalLight0.Enabled=true;
5 basicEffect.PreferPerPixelLighting=true;
6 basicEffect.DirectionalLight0.SpecularColor=Color.White.ToVector3();
7 basicEffect.SpecularPower=32;注意:当使用镜面高光,你总是会想使用per-pixel光照,因为镜子高光类型很少,非线性的点。因此,它们应该不能以内插值替换,而是为每个象素分别的计算。
代码
这个代码定义顶点去绘制一个单独的四方格。它应该被调用在程序的开始时,直到它使用相关的设备,它应该被调用在LoadContent方法结束的时候。
1 private void InitVertices()
2 {
3 vertices=new VertexPositionNormalTexture[4];
4 vertices[0]=new VertexPositionNormalTexture(new Vector3(0,0,0),new Vector3(0,1,0),new Vector2(0,1));
5 vertices[1]=new VertexPositionNormalTexture(new Vector3(0,0,-10),new Vector3(0,1,0),new Vector2(0,0));
6 vertices[2]=new VertexPositionNormalTexture(new Vector3(10,0,0),new Vector3(0,1,0),new Vector2(1,1));
7 vertices[3]=new VertexPositionNormalTexture(new Vector3(10,0,-10),new Vector3(0,1,0),new Vector2(1,0));
8 myVertexDeclaration=new VertexDeclaration(device,VertexPositionNormalTexture.VertexElement);
9 } 在你的Draw方法,添加这代码去设置你的BasicEffect到添加镜面高光到你的四方格:
1 basicEffect.World=Matrix.Identity;
2 basicEffect.View=fpsCam.ViewMatrix;
3 basicEffect.Projection=fpsCam.ProjectionMatrix;
4 basicEffect.Texture=blueTexture;
5 basicEffect.TextureEnabled=true;
6 Vector3 lightDirection=new Vector3(0,-3,-10);
7 lightDirection.Normalize();
8 basicEffect.LightingEnable=true;
9 lingtDirection.Normalize();
10 basicEffect.DirectionalLight0.Direction=lightDirection;
11 basicEffect.DirectionalLight0.DiffuseColor=Color.White.ToVector3();
12 basicEffect.DirectionalLight0.Enable=true;
13 basicEffect.PreferPerPixelLighting=true;
14 basicEffect.DirectionalLight0.SpecularColor=Color.White.ToVector3();
15 basicEffect.SpecularPower=32;
16 basicEffect.Begin();
17 foreach(EffectPass pass in basicEffect.CurrentTechnique.Passes)
18 {
19 pass.Begin();
20 device.VertexDeclaration=myVertexDeclaration;
21 device.DrawUserPrimitives<VertexPositionNormalTexture>(PrimitiveType.TriangleStrip,vertices,0,2);
22 pass.End();
23 }
24 basicEffect.End();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: