阴影可视化(第 1 部分,共 2 部分)

得益于 ODA Kernel 中新增的阴影功能,您可以计算并绘制场景中光源的阴影。本系列主题描述了如何为现有 .dwg 文件启用阴影,以及如何配置阴影渲染以获得最佳效果。

 

example with shadows

 

如果图形场景包含光源,阴影可以为现有图形场景增加额外的真实感。如果启用了照明(对于着色和真实感视觉样式),则可以渲染阴影。阴影由 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);
}

如果启用了默认视口照明,渲染器将绘制它而不是场景光源,结果您将看不到场景光源的任何阴影。

本系列的下一个主题将描述如何基于每个实体处理阴影,以及阴影如何受不同光源类型和属性的影响。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用