XNA Shader编程教程19 – 半球环境光照
原文地址:http://digierr.spaces.live.com/blog/cns!2B7007E9EC2AE37B!639.entry。
本教程我们将改变计算环境光的方法,这样可以获得比全局光更真实的效果。
半球环境光照(Hemispheric ambient light)
通常我们使用环境光强度和颜色计算环境光,这在大多数情况中工作良好,但我们想再真实一点。在真实世界中,我们看到的光线实际上是环境的反射,而不是个点光源。来自于天空、草地、汽车的光线是从某个表面反射而来的。
半球环境光是解决这个问题的一个简单方法。通过定义一个表示指向天空(表面以上的颜色)方向的向量,并计算这个向量和法线之间的夹角,我们可以获取表面反射的颜色。如果表面的法线向下,指向天空的向量向上( 0, 1, 0 ),那么这个表面的颜色就是物体下面的地面的颜色。
图19.1 红色的向量指向天空,黑色的向量是不同表面的法线。
实现shader
首先,我们需要声明一些变量。它们是指向天空的方向,天空的颜色,地面的颜色和半球光源的强度。
// Set the direction to the sky float3 SkyDirection = float3(0.0f,1.0f,0.0f); // Set ground color float4 Gc = float4(0.5f,1.0f,0.5f,1.0f); // Set sky color float4 Sc = float4(0.5f,0.5f,1.0f,1.0f); // Set the intensity of the hemisphere color float Hi = 0.7f;
天空颜色和地面颜色可以从一个立方贴图或某种形式的查询表中获取。
然后,我们必须使用新的环境光方程:
float vecHemi = (dot(N, SkyDirection) * 0.5f ) + 0.5f; float4 HemiFinal = Hi* lerp(Gc, Sc, vecHemi); return (Ai*Ac*HemiFinal*Color)+(Color*Di*Dd);
首先我们计算SkyDirection向量和表面法线的点乘。
然后基于SkyDirection和N的夹角对天空颜色和地面颜色进行插值并乘以半球环境光强度。
现在我们添加了环境光计算,我保留了原有的环境光,这样可以对环境光颜色有更多的控制,然后将它乘以半球光照。如果只想使用半球环境光照,我们可以使用以下光照方程:
return (HemiFinal*Color)+(Color*Di*Dd);
好了。这就是教程的全部。我们所做的就是获取天空和法线之间的夹角,然后计算物体表面的颜色是取自天空、还是地面或是两者的插值。
使用shader
没什么新东西。参数是在shader中设置的,但也可以将参数作为全局变量从shader外进行设置。
文件下载(已下载 1239 次)发布时间:2010/6/21 下午4:48:49 阅读次数:8697