参考教程
Tutorial 49: Shadow Mapping and Transparency
学习记录
这篇文章中我们介绍对透明物体的阴影渲染,我们将渲染一棵树的阴影(树的叶子通常以带透明度的贴图而非实体模型呈现)。
当我们渲染一棵树的时候我们使用部分透明的贴图来绘制树叶,因为如果为单个树叶建模实在是太麻烦了。所以树叶一般情况下都只是一个矩形,如果我们不开启透明度,那么绘制的结果如下:
开启了透明之后,渲染结果如下:
树的渲染已经正常了,但是其阴影还是错误的样子。这是因为我们绘制深度图的时候是针对于模型,而透明度则是保存在纹理中的。所以要渲染正常的树阴影我们需要修改我们的深度图使其支持带纹理的深度映射。
首先我们修改 depth.vs
和 depth.ps
,使其支持纹理并且当纹理的不透明度低于某一个值时候我们不计算它的深度,如下:
1 | //////////////////////////////////////////////////////////////////////////////// |
主要的改变就在这里,在 DepthShaderClass
里它只是修改为支持读取纹理,其声明如下:
1 | //////////////////////////////////////////////////////////////////////////////// |
在渲染深度图时,我们使用模型对应的纹理,部分代码如下:
1 | bool GraphicsClass::RenderSceneToTexture() |
最终效果: