Kolupsy氏によるGPUモジュールを使用しEEVEEのカメラビュー状態をリアルタイムキャプチャしテクスチャに適用出来るBlenderスクリプトがlender Artists Communityにて公開されています。
Live Scene Capture to Texture
uh oh… #b3d pic.twitter.com/m0IPDJq0In
— Kolupsy (@kolupsy) May 15, 2022
Blender Artists Community での解説
Live Scene Capture to Texture – General Forums / Blender and CG Discussions – Blender Artists Community
シーンをリアルタイムでレンダリングし、その結果をテクスチャとして出力することについて説明します。これはゲームではポータルエフェクトなどによく使われる手法ですが、Blenderのようなオフラインレンダリングソフトウェアでは必須の機能ではありません。しかし、この技法に対する需要はまだあるようです。この投稿は、Twitterの投稿でこのエフェクトを分解してほしいという要望が頻繁にあったことに端を発しています。
この効果を得るために、私たちはBlender APIの隠された、しかし非常に強力な部分であるGPUモジュールを利用します。GPUモジュールについてはこちらで詳しく説明されています。
そこに掲載されている多くの例を見ると、オフスクリーンレンダリングから画像を生成するスニペットや、カメラからのシーンビューをキャプチャしてUI上に小さなウィンドウとして表示するスニペットがあります。この2つの技術を組み合わせることで、「ライブテクスチャ」効果を実現することができます。
制限事項
- ビューポート、マテリアルプレビュー、Eeveeレンダーのみで動作
- Cyclesレンダーをキャプチャすることは不可
- パフォーマンスは良くない
- スクリプトはレンダリング時の更新を処理しないがアプリハンドラを使って実装することは技術的に可能らしい
- キャプチャには常に可視 UI 全体が含まれます。シーンの関連する部分のみをキャプチャしたい場合は、オーバーレイを切り替えることが必要
ヒント
- Eevee のビューポートサンプル数は 1 または 0を推奨
- ビューポートノイズ除去は無効を推奨
- スクリプトの解像度を設定可能:現在は1:1。好きな解像度に出来るが低解像度推奨。256×256でも十分重い。512×512はシンプルなシーンではとても効果的
- スクリプトに繰り返し変更を加えたい場合は、スクリプトを更新するたびに Blender を開くか、スクリプトの更新を自分で実装してください。
導入方法(日本語解説)
シーンにカメラを作成し、名前を「LiveCam」にしておく。
テキストエディタウインドウを表示し、新規作成。
公開されている以下のスクリプトを貼り付けて実行ボタンを押す。
import bpy, gpu, numpy as np
RES = 512
offscreen = gpu.types.GPUOffScreen( RES, RES )
CAMERA = bpy.data.objects[ 'LiveCam' ]
LIVETEX = bpy.data.images.new( 'LiveTexture', RES, RES, alpha = True )
LIVETEX.pack( )
LIVETEX.use_fake_user = True
LIVETEX.colorspace_settings.name = 'Linear'
def draw( ):
context = bpy.context
scene = context.scene
vm = CAMERA.matrix_world.inverted( )
pm = CAMERA.calc_matrix_camera( context.evaluated_depsgraph_get( ), x = RES, y = RES )
offscreen.draw_view3d( scene, context.view_layer, context.space_data, context.region, vm, pm )
gpu.state.depth_mask_set( False )
buffer = np.array( offscreen.texture_color.read( ), dtype = 'float32' ).flatten( order = 'F' )
buffer = np.divide( buffer, 255 )
LIVETEX.pixels.foreach_set( buffer )
bpy.types.SpaceView3D.draw_handler_add( draw, ( ), 'WINDOW', 'POST_PIXEL' )
問題なければシーン内にLiveTextureといテクスチャファイルが現れます。
あとはそれをモデルに適用するだけでライブキャプチャー結果を得る事が出来ます。
GPUへの負荷が高く、環境によってはかなり重たくなりますのでご注意ください。
どうしても重すぎるという方、まずはRES = 512の数値を64や128など、小さい数値で試してみると良いですよ。
こういうTipsを公開してくれたKolupsy氏に感謝ですね!ぜひお試しあれ!
リンク
I did the thing @IdoineTutorials TV effect on the live texture capture :D used an old scene to have something to capture. Man moiree even hurts when you do it intentionally #b3d #bnpr https://t.co/3xVzTA9zS9 pic.twitter.com/Zs0zRcdeoi
— Kolupsy (@kolupsy) May 15, 2022
コメント