在上一篇文章中,我们总体上启用了阴影。本主题描述了如何按实体处理阴影,以及阴影如何根据光源类型和您可以设置的属性而变化。有关启用阴影的上一篇文章,请参阅阴影可视化(第1部分,共2部分)。
按实体阴影配置
默认情况下,场景中的所有实体都会接收和投射阴影,但是,您可以控制每个实体的此行为。
void setEntityShadowParameters(OdDbEntity *pEntity, bool bCastShadows, bool bReceiveShadows)
{
pEntity->setCastShadows(bCastShadows);
pEntity->setReceiveShadows(bReceiveShadows);
}
上述代码示例中的方法不仅影响阴影生成性能,还可以帮助创建更好的视觉效果。例如,如果您的图形场景包含一个带灯罩的台灯,并且光源放置在灯罩下方,您可以将灯实体从阴影投射过程中排除,以避免为灯罩遮挡对象(阻挡对象)生成阴影。
光源类型
生成的阴影取决于光源的类型:
- 远光灯 — 最简单的光源类型。它仅由一个光方向向量指定,并影响整个图形场景。
- 聚光灯 — 表示场景内的照明锥。它具有位置、方向和控制投影仪照明区域的角度。
- 点光源 — 仅由位置指定,并向所有图形场景方向发光。
聚光灯和点光源类型包含额外的衰减参数,可用于控制光强度从光源到不同距离的衰减。建议使用起始和结束光衰减限制来控制照明区域,并排除场景中不需要照明的部分。
本系列的下一个主题将介绍如何使用各种属性进一步控制阴影。
渲染器设置
渲染器包含用于精确控制阴影行为的附加属性。通常这些属性不是必需的,可以使用其默认设置,但有时它们有助于获得更稳定或正确的结果。
- ShadowsRenderMode — ShadowsRenderMode 属性表示一个位掩码,可用于启用/禁用阴影生成功能,例如立方体贴图、平滑等。
- VsmShadowsAmount — 方差阴影可能包含由场景中遮挡对象边缘与其它遮挡对象之间存在较大距离而引起的伪影。这种效应称为漏光。不幸的是,这种效应的程度取决于渲染场景的具体情况,无法自动计算。VsmShadowsAmount 属性使您能够最大限度地减少所述的漏光效应,并且可以由客户端应用程序进行实验性选择。
- ShadowMapSoftnessOverride — ShadowMapSoftnessOverride 属性提供了覆盖场景中所有光源的阴影模糊效果量的能力。默认情况下,它已启用并设置为 3。它可以设置为 [0..3] 范围内的值。
- ShadowMapSizeOverride — ShadowMapSizeOverride 属性提供了覆盖场景中所有光源的阴影纹理大小的能力。默认情况下,它处于禁用状态。更大的纹理尺寸可以获得更详细的阴影,但阴影边缘更清晰。较小的纹理尺寸使阴影边缘更平滑,但细节更少。更大的纹理尺寸还需要更多的 GPU 内存和资源用于阴影贴图生成。
这些阴影属性在 ODA 文档中进行了更详细的描述(需要登录)。
所有阴影属性都可以通过标准图形系统属性接口进行设置。有关矢量化属性的更多信息,请参阅 ODA 矢量化设备属性(需要登录)。