常见问题:如何在几何图形显示和图形缓存自动重新生成期间解决大坐标问题?

基于 DirectX/OpenGL 图形 API 的矢量化模块(“WinOpenGL.txv”、“WinDirectX.txv”和“WinGLES2.txv”)由于硬件限制,无法准确渲染大坐标的几何图形。GPU 使用 32 位浮点数,并且不了解表示几何图形坐标的 64 位双精度浮点数,因此会发生双精度到浮点数的截断,如果几何图形远离原点,则会导致几何图形渲染问题(伪影)。

以下示例图显示了双精度到浮点数截断的伪影。几何图形看起来有棱角且破碎,就像被某个网格吸引一样:

image1

矢量化器可以解决此渲染问题,但它们需要重新生成几何图形缓存以将几何图形坐标重新计算为合适的坐标系。例如,如果图像变得不准确,应用程序可以自动重新生成几何图形缓存。

如果几何图形需要重新生成,此方法返回 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 类。

几何图形重新生成后的示例图:

image2

 

今天就开始行动

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

免费试用