Surface Space Ambient Occlusion#

Surface Space Ambient Occlusionの使用方法を説明します.

Surface Space Ambient Occlusion (SSAO) は,レイトレーシングよりも効率的に影を近似でき,同様の結果を得ることができます.近くのメッシュが近くの光源を遮ることで互いに及ぼすオクルージョン効果をプロットしたい場合に使用します.

詳しくは Kitware: Screen-Space Ambient Occlusion をご覧ください

# First, let's create several cubes nearby each other

import pyvista as pv
from pyvista import examples

grid = pv.ImageData(dimensions=(5, 5, 5)).explode(0.2)

デフォルトでプロットする#

これを SSAO なしでプロットしてみましょう.各キューブで照明が同じであることに注意してください.

pl = pv.Plotter()
pl.add_mesh(grid)
pl.show()
ssao

SSAOを使ったプロット#

今度はこれをSSAOでプロットしてみましょう.隣接するキューブが互いの照明に影響を与え,人工的でないように見えることに注意してください.

低い kernel_size では,画質を犠牲にして,画像のレンダリングが速くなります.

pl = pv.Plotter()
pl.add_mesh(grid)
pl.enable_ssao(kernel_size=32)
pl.show()
ssao

SSAOレンダリングの改善#

ここでは,SSAO の品質を向上させるために kernel_size を大きくし,SSAO から生じるアーティファクトを滑らかにするために SSAA アンチエイリアシングも有効にしています.

pl = pv.Plotter()
pl.add_mesh(grid)
pl.enable_ssao(kernel_size=128)
pl.enable_anti_aliasing('ssaa')
pl.show()
ssao

SSAOを使用しないCADモデルの作図#

こちらもSSAOを使わない例です.これはRaspberry PIの筐体のCADモデルです.

mesh = examples.download_cad_model_case()

pl = pv.Plotter()
pl.add_mesh(mesh, smooth_shading=True, split_sharp_edges=True)
pl.enable_anti_aliasing('ssaa')
pl.camera.zoom(1.7)
pl.show()
ssao

SSAOを使ったプロット#

同じCADモデルをSSAOで表示したところです.シーンの大きさが相対的に大きくなったため, radiusbias の両方を大きくする必要があったことに注意してください.

オクルージョンはまだかなり小さいようですが,注意してください.次の例では, radius を大きくして,オクルージョンの効果を大きくしてみましょう.

pl = pv.Plotter()
pl.add_mesh(mesh, smooth_shading=True, split_sharp_edges=True)
pl.enable_ssao(radius=2, bias=0.5)
pl.enable_anti_aliasing('ssaa')
pl.camera.zoom(1.7)
pl.show()
ssao

半径を大きくする#

ここでは,ケースオクルージョンが過剰にならずにリアルに見える程度に radius を大きくしています.

pl = pv.Plotter()
pl.add_mesh(mesh, smooth_shading=True, split_sharp_edges=True)
pl.enable_ssao(radius=15, bias=0.5)
pl.enable_anti_aliasing('ssaa')
pl.camera.zoom(1.7)
pl.show()
ssao

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

Sphinx-Galleryによるギャラリー