游戏渲染中常用阴影技术

游戏软件开发中实现阴影的方式有很多,其中能够随着光源和环境变化,动态产生阴影的技术称为实时阴影技术,不能随着光源和环境变化的阴影技术称之为静态阴影技术,在游戏的特效中实现中通常使用一下几种方法:

  1. 用一个特定形状的黑色贴图来表示阴影,2D游戏中常见,比如某个角色脚下的黑色圈圈;
  2. 平面阴影;
  3. Shadow Volume阴影体技术
  4. Shadow Mapping技术;

其中第一种就是一种贴图的方式没什么好说的,第二个平面阴影和摄像机投影矩阵的原理一样,将3D的物体投影到2D平面上,并且将物体的反射系数设置为{0.0f, 0.0f, 0.0f, 0.5f},这样设置是因为纹理采样后的颜色与反射系数相乘后颜色变为黑色、透明度变为0.5,注意渲染该阴影的时候一定要开启Blend混合,否者阴影为全黑。

	//shadowPlane为投影的平面即最后阴影所在的平面(该平面为假象平面,可以不存在)
	XMVECTOR shadowPlane = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); // xz plane
	
	//指向光的方向,即光方向的的反方向
	XMVECTOR toMainLight = -XMLoadFloat3(&mMainPassCB.Lights[0].Direction);
	
	//微软DX数学库中提供计算阴影投射矩阵的方法
	XMMATRIX S = XMMatrixShadow(shadowPlane, toMainLight);
	//给阴影一个y轴的偏移,防止阴影和平面(真实平面)重叠在一起,出现闪烁
	XMMATRIX shadowOffsetY = XMMatrixTranslation(0.0f, 0.001f, 0.0f);
	XMStoreFloat4x4(&mShadowedSkullRitem->World, skullWorld * S * shadowOffsetY);
平面阴影技术

平面阴影技术

第一、二种方法都比较容易实现,但是都有比较明显的缺点,第一种都只能是静态的阴影,第二种则只能实现平面阴影,无法将阴影投射到曲面上,第三种方法则比较好可以实现动态的阴影也可以将阴影投射到曲面上,但是实现的方式比较困难。第三种方法的具体原理可以看我另外的一篇博客Shadow Volume技术;第四种方法暂时还未写;

未经允许不得转载:他日重逢 » 游戏渲染中常用阴影技术

赞 (2) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

隐藏
变装