Skip to content

routersys/YMM4-PerspectiveShadow

Repository files navigation

影(立体投影)for YMM4

License .NET Release


YukkuriMovieMaker4(YMM4)上で動作する、点光源からの透視投影によって落ちる立体的な影を生成する映像エフェクトプラグインです。 HLSL ピクセルシェーダーを Direct2D カスタムエフェクトとして実装しており、GPU 上でのリアルタイムレンダリングが可能です。 光源位置・高さ・接地線を基にした透視変換と、距離に応じた動的ブラーにより、奥行きのある自然な落ち影を実現します。 光源座標はキーフレームアニメーションに対応しており、光が動くような演出も可能です。

Image


目次

  1. 概要
  2. 動作要件
  3. インストール方法
  4. 主な機能
  5. アルゴリズム
  6. パラメータ一覧
  7. 使い方ガイド
  8. 注意事項
  9. 免責事項
  10. ライセンス

概要

本プラグインは YMM4 の「映像エフェクト」として動作します。対象アイテムに対して、仮想的な点光源と接地面を設定し、透視投影に基づいた落ち影をリアルタイムで描画します。

内部的には Direct2D カスタムピクセルシェーダーエフェクト(D2D1CustomShaderEffectBase)として実装されており、HLSL コンパイル済みシェーダー(.cso)をエフェクトチェーン上で動作させます。

各出力ピクセルについて、透視投影の逆変換(UnprojectFromShadow)により影の投影元ピクセルを算出し、そのアルファ値をサンプリングして影を構成します。サンプリング時には光源からの距離に応じた動的ブラーをボロノイ分布に近い黄金角サンプリングで適用し、遠距離ほど拡散したソフトエッジを生成します。最終的に影は元の映像と src-over 合成され、元映像の透明部分にのみ描画されます。

出力矩形は影の投影先を包含するよう拡張されます。光源位置・光源の高さ・接地線によって影の伸び方と長さが変化するため、出力矩形は動的に計算されます。


動作要件

項目 要件
OS Windows 10 バージョン 2004 (ビルド 19041) 以降 / Windows 11 (64bit)
YukkuriMovieMaker4 最新版を推奨
ランタイム .NET 10.0

インストール方法

  1. Releases ページから最新のプラグインファイル(.ymme)をダウンロードしてください。
  2. YMM4 が起動していないことを確認し、ダウンロードしたファイルを実行(ダブルクリック)してインストールします。
  3. YMM4 を起動し、タイムライン上のアイテムに映像エフェクトを追加します。
  4. 映像エフェクトの種類として 「影(立体投影)」 を選択してください。

主な機能

1. 透視投影による影の生成

仮想的な点光源(光源X・光源Y・光源の高さ)と接地面(接地線Y)のパラメータから、透視投影に基づいた落ち影を計算します。光源が低い・近いほど影は長く伸び、高い・遠いほど短くなります。

シェーダー内では出力ピクセル座標を UnprojectFromShadow 関数で逆変換し、各ピクセルが「どのオリジナルピクセルの影になりうるか」を求めます。この逆変換が有効な座標のみが影として描画されます。

2. 距離に応じた動的ブラー

影のソフトエッジ半径(ぼかし半径)は固定値ではなく、光源からの投影距離に応じて動的に拡大します。

dynamicBlur = blurRadius × (1 + min(shadowDist / lightHeight × spread, 3.0))

ブラーが 0.5px 以下の場合は単一サンプリング、それ以上の場合は黄金角(約 137.5°)を用いたポアソンディスク状のスパイラルサンプリングに切り替わります。サンプル数は dynamicBlur × 2 を基に 16〜128 の範囲でクランプされ、各サンプルにはガウス重み(exp(-2r²))が乗算されます。

3. 距離減衰とシルエットしきい値

距離減衰は影の先端に向かって薄くなる強さです。内部的には距離に基づく減衰係数 1 / (1 + dist × 0.005)falloff の値で lerp することで実現しています。falloff が 0 のとき減衰なし、1 のとき最大減衰となります。

シルエットしきい値は、元ピクセルのアルファ値が小さい半透明領域を影の輪郭として扱うかどうかの境界です。SmoothAlphaThreshold 関数により [threshold × 0.5, threshold × 1.5] の範囲で smoothstep 補間が適用され、しきい値付近のアルファ値がなめらかに抑制されます。

4. キーフレームアニメーション

光源X・光源Y・光源の高さ・接地線Y・不透明度・距離減衰・ぼかし半径・拡散・シルエットしきい値の全パラメータがキーフレームアニメーションに対応しています。また、光源座標(光源X・光源Y)はビューポート上のコントローラーポイントとして表示され、マウスで直接ドラッグして操作することもできます。


アルゴリズム

各出力ピクセル P に対して以下の処理を行います。

  1. 元映像のサンプリング: 現在の出力座標に対応する元映像ピクセル original を取得します。
  2. 逆投影: UnprojectFromShadow(P) により、P が影として表示する場合の投影元座標 Q を計算します。計算は以下の式に従います。
    • 倍率 m = (P.y - lightY) / (groundY - lightY)m < 1 の場合は無効)
    • Q.x = lightX + (P.x - lightX) / m
    • Q.y = groundY - lightHeight × (1 - 1/m)
    • Q.y が接地線より下の場合は無効
  3. 動的ブラーの計算: Q から P までの距離 shadowDistspread を用いて dynamicBlur を求めます。
  4. アルファサンプリング:
    • dynamicBlur ≤ 0.5 の場合: Q の UV 座標から単一サンプリングし SmoothAlphaThreshold を適用します。
    • dynamicBlur > 0.5 の場合: 黄金角スパイラル(16〜128 サンプル)でガウス重み付き積分を行い、正規化したアルファ値を得ます。
  5. 減衰の適用: falloff に基づく距離減衰係数を乗算し、最終的なアルファ値を alpha × opacity × decay × shadowColor.a で計算します。
  6. 合成: shadow = float4(shadowColor.rgb × finalAlpha, finalAlpha) として、元映像と src-overresult.rgb = original.rgb + shadow.rgb × (1 - original.a))で合成します。

パラメータ一覧

光源

パラメータ名 デフォルト スライダー範囲 アニメーション 説明
光源X 数値 (px) 0 −1000 〜 1000 px 光源の水平位置
光源Y 数値 (px) −500 −1000 〜 1000 px 光源の垂直位置
光源の高さ 数値 (px) 2000 50 〜 2000 px 光源の仮想的な高さ。小さいほど影が長く伸びる
接地線Y 数値 (px) 0 −1000 〜 1000 px 影が落ちる地面の位置。素材下端を基準としたオフセット

影の見え方

パラメータ名 デフォルト スライダー範囲 アニメーション 説明
不透明度 数値 (%) 75 0 〜 100 % 影全体の不透明度
距離減衰 数値 (%) 40 0 〜 100 % 影の先端に向かって薄くなる強さ。0 で減衰なし
ぼかし半径 数値 (px) 2 0 〜 32 px 影のソフトエッジ半径。距離に応じて動的に拡大する
拡散 数値 0.30 0 〜 1 距離が大きいほど影のエッジが拡散する強さ
シルエットしきい値 数値 0.05 0 〜 1 シルエットとして扱う不透明度のしきい値
影の色 #FF000000(黒) 影の色を ARGB カラーピッカーで指定

使い方ガイド

基本的な使い方

  1. タイムライン上のアイテムを選択し、エフェクトを追加します。
  2. 映像エフェクトの種類として 「影(立体投影)」 を選択します。
  3. 光源X・光源Y を調整して光が当たる方向を決めます。ビューポート上のコントローラーポイントをドラッグして直接操作することもできます。
  4. 光源の高さ を調整します。値が小さいほど影が長く伸び、大きいほど短くなります。
  5. 接地線Y で影が落ちる地面の位置を素材下端からのオフセットで設定します。

影の質感を整える

ぼかし半径拡散 を組み合わせることで影の質感を調整できます。ぼかし半径 が基本のソフトエッジ量を決め、拡散 が距離に応じてそれを拡大する割合を制御します。両方を大きくするほど、遠方でよりソフトに広がる自然な影になります。

距離減衰 を上げると影の先端が薄くなり、光が強い状況や遠方への影を表現するのに有効です。

半透明素材での調整

半透明のテキストや画像に適用する場合、シルエットしきい値 を調整することで影の輪郭の精度を制御できます。値を大きくすると半透明部分を影の輪郭から除外し、くっきりとしたシルエットが得られます。値が 0 に近いほど元の透明度を忠実に反映します。

光源をアニメーションさせる

光源X・光源Y のキーフレームを設定することで、光が時間とともに動くような演出が可能です。例えば光源Xを左から右へ変化させると、影が反対方向に流れるように移動します。

影の色を変える

影の色 はデフォルト黒ですが、カラーピッカーで任意の色に変更できます。ARGB のアルファ値も参照されるため、半透明の色付き影を作ることも可能です。


注意事項

  • AviUtl 非対応: 本プラグインは HLSL ピクセルシェーダーおよび Direct2D カスタムエフェクトを使用しているため、AviUtl 形式(.exo)への出力には対応していません。
  • 影の色のアニメーション非対応: 影の色Color 型であり、キーフレームアニメーションには対応していません。
  • 出力矩形の拡張: 本エフェクトは影の投影先を包含するよう出力矩形を拡張します。光源位置と素材の位置関係によっては、出力矩形が素材の上下左右に最大 4096 px まで拡張される場合があります。
  • 光源の高さの最小値: 光源の高さ は内部で最小 1 px にクランプされます。0 以下の値を設定しても 1 として扱われます。
  • 影の投影範囲の制限: 影の投影倍率は最大 10 倍に制限されています。光源が地面に極めて近い場合でも、影が無限遠に伸びることはありません。
  • 本プラグインを使用する前に、YMM4 プロジェクトファイルのバックアップを作成することを推奨します。

免責事項

本プラグインは MIT ライセンスのもとで公開されています。

本ソフトウェアは「現状のまま」提供されており、明示・黙示を問わず、商品性、特定目的への適合性、および権利非侵害に関する保証を含む、いかなる種類の保証も行いません。

作者は、本プラグインの使用または使用不能に起因するいかなる損害についても、一切の責任を負いません。 ご利用は自己責任でお願いします。


ライセンス

MIT License

About

点光源からの透視投影によって落ちる立体的な影を生成する映像エフェクト

Topics

Resources

License

Stars

Watchers

Forks

Contributors