Repository navigation
Replies: 1 comment
ChatGPTの回答いいですね。要件を満たしつつ Unity と O3DE で共通化できる「軽量・汎用」の基盤案をまとめました。頂点ジオメトリを本格的に作り替えず、シェーダー側で“見た目の破綻防止+押し出し/凹み表現”を行う設計です。 方針の全体像
ボディ衝突フィールド(SDF 近似) スケルトンに沿ったカプセル群で身体を近似します(1ボーンに1〜数本)。 各カプセルは (p0, p1, radius)(ボーンローカル)で定義し、毎フレームスキニング後のワールド変換を渡すだけ。 メモリ・速度・移植性のバランスが非常に良く、Unity/O3DE 双方で扱いやすい。 衣服側パラメータ margin(最小離隔)、stiffness(押し出し剛性)、maxPush(最大押し出し量)、mode(締め付け/スカート系) Tightness マスク(UV テクスチャ)…締め付けの強さ(0〜1)。 Softness マスク(任意)…布の柔らかさ(押し出しの出方を緩和)。 ペアリングリスト (BodyRenderer, ClothRenderer, Parameters) のペアを登録。外側→内側の順に描画。 レンダー順制御だけでなく、同じ Body カプセル群を複数衣服で共有可。
基本:身体→(任意で身体の深度プリパス)→衣服。 衣服頂点シェーダーで SDF を用いた押し出し(正) or 埋まり解消を行い、見た目上必ず外側に来るように補正。 透過/カットアウト系は小さめの depth offsetや margin を使いZ ファイティング回避。 締め付け(皮膚側の凹み): スキン側フラグメントで Tightness を読み、法線/AO/SSSを局所的に調整して“凹んだ見え方”を作る(ジオメトリは変えない)。 動的にやるなら衣服側から**“圧マスク”**を出す方法もあるが、まずは 衣服固有テクスチャ(Tightness) で十分実用。 スカート等の膨らみ: 衣服側頂点を SDF 勾配方向に外へ押し出し。mode=Skirt のとき重力方向や脚カプセルへのバイアスを加えて“押されて膨らむ”印象を出す。 注:ここで言う「メッシュ変形」は描画時の頂点オフセットのみで、リグや基本形状の編集の置き換えはしません(ご要望通り“基本的なメッシュ変形は担当外”)。 具体アルゴリズム(共通 HLSL コア) float sdCapsule(float3 p, Capsule cap) 最小 SDF と勾配(数値近似) float3 approxGrad(float3 p, StructuredBuffer caps, uint count) 衣服:頂点押し出し(埋まり解消+スカート膨らみ) float3 solvePushOut(float3 worldPos, float tightness, StructuredBuffer caps, uint capCount, PushParams P) } 皮膚:締め付けの“見た目”表現(法線/AO/SSS 調整) これらは HLSL 共通ヘッダ(例:ClothCollisionCommon.hlsl)として切り出し、Unity(HLSL/ShaderGraph Custom Function)も O3DE(AZSL は HLSL 互換構文)も同一ロジックを流用できます。 Unity 実装メモ(URP/HDRP 共通の考え方) カプセル定義と更新(C#) 各ボーンにローカル p0,p1,r を持つ ScriptableObject を用意。 毎フレーム、対応ボーンのスキニング後ワールド座標に変換して ComputeBuffer (StructuredBuffer) に書き込み、衣服/皮膚マテリアルに SetBuffer。 衣服シェーダー 頂点ステージで solvePushOut を呼び、Tightness テクスチャも頂点 or ピクセルで参照(頂点カラーで代用可)。 透過/カットアウトは ZTest LEqual のまま、margin と小さな Offset で干渉低減。 皮膚シェーダー Fragment で applyTightLook。衣服と共通の Tightness を共有するなら、グローバルテクスチャにするか、ボディ側にも同一 UV を持つ想定で個別設定。 描画順 Body(必要なら Depth Prepass) → Opaque Cloth → Transparent Cloth の順。 完全に覆う衣服は Stencil で皮膚をカリングする最適化も可(任意)。 O3DE (Atom) 実装メモ シェーダー:AZSL は HLSL ベース。SRG に StructuredBuffer を用意。 Pass 設定:衣服用マテリアルに専用シェーダーを割当て、DrawListTag で衣服 → 皮膚の順序や深度設定を制御。 更新:Animation/Transform システムから各フレームカプセル SRGを更新(RPI::ShaderResourceGroup 経由)。 アート/物理パラメータ(最小セット) margin:1–3mm(視差/解像度で調整) stiffness:0.3–0.8(衣服の硬さ) maxPush:2–10cm(安全上限。過剰押し出し防止) skirtBias:0–0.7(膨らみ演出) Tightness:0–1(衣服テクスチャ) Softness(任意):0–1(押し出しの鋭さを丸める) 破綻対策と注意点 薄い布&鋭角部:margin を小さくし過ぎるとモアレや Z-fight。Offset と勾配近似の e を適度に。 階段状押し出し:頂点密度が低い場合に段差が出る → 頂点法線スムーズ+ピクセル側で微小シェーディング補正。 極端なポーズ:maxPush が効いて輪郭が潰れる場合、Capsule 配置(本数/半径)を見直す。 コスト:Capsule 本数×頂点数に比例。LOD で 遠景は無効化、近景のみ適用推奨。 検証手順(再現性/テスト観点) 静止ポーズ3種(直立/屈伸/脚上げ)×(タイト衣服/スカート)で 交差ゼロ(目視/線形深度可視化) 押し出し量が maxPush を超えない アニメ調/リアル調 アニメ:法線を強めに、陰影コントラスト↑、SSS 低め リアル:法線控えめ、SSS/微小 AO で自然な凹み 解像度変更(720p↔4K)でモアレ/貫通が出ない パフォーマンス:衣服頂点 50k、Capsule 48 本で 60fps 維持(目安) ロードマップ(段階導入) Phase 1(最小):Capsule SDF 押し出し(衣服のみ)、Tightness で皮膚の見た目凹み(静的)。 Phase 2(拡張):スカート専用バイアス、部位別パラメータ、Stencil 最適化。 Phase 3(高品位):簡易“圧マスク”の動的生成(衣服からスクリーンスペースへ描き出し、皮膚で参照)。 次ステップ(すぐ着手できる作業) 骨ごとの Capsule 配置表 を作る(head/torso/upper-leg/lower-leg/upper-arm/lower-arm 等)。 Unity で ClothCollisionCommon.hlsl を組み込み、衣服頂点押し出しを試験。 皮膚側に Tightness を読み込む簡易ノード(ShaderGraph)/コードを追加。 O3DE へ移植(AZSL 変換・SRG 接続・Pass 設定)。 必要なら、Unity 用の C# CapsuleRigUpdater と O3DE 用の SRG 更新コードの雛形も用意します。 |
Uh oh!
There was an error while loading. Please reload this page.
これは今年前半に考えていたものを明文化したもの。Project Sansa標準にしたいので、追々進めます。
服の表現で、服を貫通することがあるため、シェーダー側で改善したい。
服+身体メッシュのリストを設定することで、外側から描画させる。
服には、締め付け系→皮膚側が凹む、スカート→皮膚側に押されて膨らむ、表現があり、シェーダーが表現する。
基本的なメッシュ変形は、シェーダーの担当外。
シェーダーでは破綻を防ぐ。
従来、締め付け表現はメッシュ側を変形させるが、着替え前提だとシェーダー側で対応したい。
これらの基盤の上に、リアル表現、アニメ調などを実現したい。
Unity以外にo3deにも対応したいので共通化は進めたい。
All reactions