DirectX/OpenGL グラフィックス API に基づくベクトル化モジュール(「WinOpenGL.txv」、「WinDirectX.txv」、「WinGLES2.txv」)は、ハードウェアの制限により、大規模な座標のジオメトリを正確にレンダリングできません。GPU は 32 ビット浮動小数点数で動作し、ジオメトリ座標を表す 64 ビット倍精度浮動小数点数については何も知らないため、倍精度から単精度への切り捨てが発生し、ジオメトリが原点から遠い場合にジオメトリのレンダリング問題(アーティファクト)を引き起こします。
次の描画例は、倍精度から単精度への切り捨てによるアーティファクトを示しています。ジオメトリは角張っていて壊れているように見え、特定のグリッドに引き寄せられているようです。
ベクトル化ツールはこのレンダリング問題を修正できますが、ジオメトリ座標を適切な座標系に再計算するためにジオメトリキャッシュの再生成が必要です。たとえば、画像が不正確になった場合、アプリケーションはジオメトリキャッシュを自動的に再生成できます。
このメソッドは、ジオメトリが再生成を必要とする場合に true を返します。
inline bool requireAutoRegen(OdGsView *pView)
{
OdGsDevice *pDevice = pView->device();
if (!pDevice)
return false;
OdRxDictionaryPtr pProps = pDevice->properties();
if (!pProps.isNull())
{
if (pProps->has(OD_T("RegenCoef")))
{
return OdRxVariantValue(pProps->getAt(OD_T("RegenCoef")))->getDouble() > 1.;
}
}
return false;
}
RegenCoef ベクトル化デバイスプロパティは、現在の座標系で倍精度から単精度への変換によって影響を受けるピクセル数を表します。アプリケーションは、画面を更新する前にジオメトリキャッシュが不正確かどうかを確認し、必要であればキャッシュの再生成を実行できます。
if (requireAutoRegen(pView))
{
m_pDevice->invalidate();
if (m_pDevice->gsModel())
m_pDevice->gsModel()->invalidate(OdGsModel::kInvalidateAll);
}
このソースコード例の m_pDevice は OdGsLayoutHelper クラスを表します。
ジオメトリ再生成後の描画例: