注釈
Go to the end をクリックすると完全なサンプルコードをダウンロードできます.
アンチエイリアシング#
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()
デフォルト: マルチサンプルアンチエイリアシング(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()
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()
高速近似アンチエイリアシング (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()
スーパーサンプルアンチエイリアシング(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()
レンダリング時間を比較する#
各アンチエイリアシングアプローチのレンダリングにかかる時間は,以下で比較できます:
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)