得益于 ODA Kernel 中新增的阴影功能,您可以计算并绘制场景中光源的阴影。本系列主题描述了如何为现有 .dwg 文件启用阴影,以及如何配置阴影渲染以获得最佳效果。
如果图形场景包含光源,阴影可以为现有图形场景增加额外的真实感。如果启用了照明(对于着色和真实感视觉样式),则可以渲染阴影。阴影由 OdGiShadowParameters 类表示,并作为光源参数的一部分进行管理。
为光源启用阴影
首先,为场景中投射阴影的光源启用阴影:
void configureLightSourceShadow(OdDbLight *pLight)
{
OdGiShadowParameters shadowParams = pLight->shadowParameters();
shadowParams.setShadowsOn(true);
shadowParams.setShadowType(OdGiShadowParameters::kShadowMaps);
shadowParams.setShadowMapSize(256);
shadowParams.setShadowMapSoftness(1);
pLight->setShadowParameters(shadowParams);
}
每个光源都可以有自己的阴影参数。光源在 OdDbDatabase 中表示为 OdDbLight 实体。
阴影参数包含以下用于主要属性的设置方法:
- 可以调用 setShadowsOn() 方法来启用或禁用配置光源的阴影。
- 可以调用 setShadowType() 方法来设置阴影类型。GL2 渲染器始终调用阴影贴图,不支持其他模式,因此建议始终将此参数设置为 kShadowMaps。
- 可以调用 setShadowMapSize() 方法来设置阴影贴图纹理的大小。更大的纹理尺寸会增加阴影细节,但需要额外的资源并使最终阴影更清晰。更小的纹理尺寸会减少阴影细节,但使最终阴影更平滑。
- 可以调用 setShadowMapSoftness() 方法来设置阴影平滑度。目前支持四个平滑阶段:
| 0 | 禁用平滑。 |
| 1 | 使用 3x3 高斯模糊核进行平滑。 |
| 2 | 使用 5x5 高斯模糊核进行平滑。 |
| ≥3 | 使用 7x7 高斯模糊核进行平滑。 |
由于模糊是在 GPU 端执行的,因此高斯核大小之间没有严重的性能差异;此参数主要影响模糊效果的量(模糊区域的大小)。
为视觉样式启用阴影
每个启用了 Phong 模型照明的视觉样式都可以用于显示阴影,但并非所有默认视觉样式都默认启用了阴影属性。
void enableVisualStyleShadows(OdDbVisualStyle *pVisualStyle)
{
pVisualStyle->setTrait(OdGiVisualStyleProperties::kDisplayShadowType, (OdInt32)OdGiVisualStyleProperties::kShadowsFull);
}
要启用视觉样式阴影,请将 kDisplayShadowType 属性设置为 kShadowsNone 以外的值。建议使用 kShadowsFull 设置。此外,建议启用逐像素照明,因为逐面和逐顶点照明不足以显示所有阴影贴图细节。
默认视口照明
最初,使用的是默认视口照明,您需要禁用它:
void defaultDefaultLights(OdDbViewport *pViewport)
{
pViewport->setDefaultLightingOn(false);
}
如果启用了默认视口照明,渲染器将绘制它而不是场景光源,结果您将看不到场景光源的任何阴影。
本系列的下一个主题将描述如何基于每个实体处理阴影,以及阴影如何受不同光源类型和属性的影响。