アンチエイリアシング#

PyVistaでアンチエイリアシングのデモを行います.

PyVistaは,3種類のアンチエイリアスをサポートしています:

  • SSAA - スーパーサンプリングアンチエイリアシング

  • MSAA - マルチサンプルアンチエイリアシング

  • FXAA - 高速近似アンチエイリアシング

デフォルトでは,MSAAアンチエイリアスは8サンプルを使用して有効になっています.これはVTKのデフォルトです.

>>> import pyvista as pv
>>> pv.global_theme.multi_samples
8

SSAAまたはFXAAを有効にすることで,追加のラインスムージングを有効にできます.

どのようなアンチエイリアシング技術を使うべきでしょうか?

通常,デフォルトのMSAAアンチエイリアスは,効率と品質のバランスを取るため,十分であるべきです.さらにスムージングをかけたい場合は, multi_samples の数を増やすか,SSAAを使用します.ローエンドのPCはFXAAを検討してください.

import pyvista as pv

mesh = pv.Icosphere()

アンチエイリアシングなし#

まず,アンチエイリアスを一切かけないプロットを表示してみましょう.

pl = pv.Plotter()
pl.add_mesh(mesh, style='wireframe', color='k', line_width=2)
pl.disable_anti_aliasing()
pl.camera.zoom(1.5)
pl.show()
anti aliasing

デフォルト: マルチサンプルアンチエイリアシング(MSAA)#

次に,デフォルトのアンチエイリアス設定を示します.デフォルトでは,PyVistaは8サンプルのMSAAを使用します.

MSAAまたはマルチサンプルアンチエイリアスは,SSAAの最適化で,シーンの重複する領域に焦点を当てることで,計算が必要なピクセルシェーダーの評価量を削減します.その結果,エッジに沿ったアンチエイリアシングはSSAAと同等になり,サーフェスに沿ったアンチエイリアシングはSSAAの計算の大部分を占めるため,より少なくなります.MSAAはSSAAに比べ大幅に計算量が少なく,同等の画質が得られます.

pl = pv.Plotter()
pl.add_mesh(mesh, style='wireframe', color='k', line_width=2)
pl.camera.zoom(1.5)
pl.show()
anti aliasing

multi_samples を増やすことで,平滑度を上げることができます.

pl = pv.Plotter()
pl.add_mesh(mesh, style='wireframe', color='k', line_width=2)
pl.enable_anti_aliasing('msaa', multi_samples=16)
pl.camera.zoom(1.5)
pl.show()
anti aliasing

高速近似アンチエイリアシング (FXAA)#

FXAAは,3つのアンチエイリアシング技術の中で最もパフォーマンスが高い技術です.これは,ハードウェアやGPUの観点から,FXAAがそれほど要求されないためです.2D画像を直接平滑化するので,GPUへの負担が少なく,ローエンドのPCに最適です.

FXAAはレンダリング画像に対してのみ動作するため,通常は鮮明さを保つためにシャープにされているビジュアルオーバーレイの一部が滑らかになったり,テクスチャが滑らかになったりすることがあります.一般的に,FXAA は MSAA や SSAA よりも劣ります.

一貫性を保つために,線幅が調整されていることに注目してください.

pl = pv.Plotter()
pl.add_mesh(mesh, style='wireframe', color='k', line_width=1.5)
pl.camera.zoom(1.5)
pl.enable_anti_aliasing('fxaa')
pl.show()
anti aliasing

スーパーサンプルアンチエイリアシング(SSAA)#

SSAAまたはスーパーサンプルアンチエイリアシングは,アンチエイリアシングのブルートフォース当り方式です.最高の画質が得られますが,膨大なリソースコストがかかります.SSAAは,シーンをより高い解像度でレンダリングすることで機能します.最終的な画像は,平均化フィルタを使用して巨大なソース画像をダウンサンプリングすることによって生成されます.これはローパスフィルタとして機能し,ギザギザの原因となる高周波成分を除去します.

一貫性を保つために,線幅が調整されていることに注目してください.

pl = pv.Plotter()
pl.add_mesh(mesh, style='wireframe', color='k', line_width=4)
pl.camera.zoom(1.5)
pl.enable_anti_aliasing('ssaa')
pl.show()
anti aliasing

レンダリング時間を比較する#

各アンチエイリアシングアプローチのレンダリングにかかる時間は,以下で比較できます:

n_render = 100
for anti_aliasing in [False, 'fxaa', 'msaa', 'ssaa']:

    pl = pv.Plotter(off_screen=True)
    pl.add_mesh(mesh, style='wireframe', color='k', line_width=4)
    pl.camera.zoom(1.5)
    if anti_aliasing:
        pl.enable_anti_aliasing(anti_aliasing)
    else:
        pl.disable_anti_aliasing()
    pl.show(auto_close=False)
    tstart = time.time()
    # repeately trigger a render via saving a screenshot
    for __ in range(n_render):
        pl.screenshot('tmp.png')
    telap = (time.time() - tstart)/n_render

    print(f'Render time for {str(anti_aliasing):6}: {telap*1000:.3f} ms')

以下は,NVIDIA Quadro P2000とIntel(R) Xeon(R) E-2288G CPU @ 3.70GHzの計時です:

Render time for False : 37.045 ms
Render time for fxaa  : 40.458 ms
Render time for msaa  : 42.566 ms
Render time for ssaa  : 51.450 ms

Total running time of the script: (0 minutes 1.643 seconds)

Sphinx-Galleryによるギャラリー