Deferred Geometry Refresh
Transform操作中にBlenderがGeometry Updateも通知する場合、毎イベントでEvaluated Meshを再解析しないようDeferred Queueへまとめます。
Deferred Geometry処理自身がDepsgraph Callbackを発生させるため、Handler Suspend Transaction内で実行します。
Geometry-only変更の場合はTargeted Geometry Refreshを実行します。
Persistent Broad-phase Culling
v0.3.6の主要なPerformance最適化です。
Target Vertex GroupごとにLocal AABBを保持します。
Target Object移動時、Exact計算の前に現在のTarget UnitがOccluderへ影響する可能性があるかを安価に判定します。
主な判定材料はMaterial / Rendered View Context、Target Unit Local AABB、Occluder Projected Bounds、NDC Rectangle Overlap、View Frustum、Conservative Depth Relationshipです。
NDC Marginは0.05です。
v0.3.6ではTime-based CULL-RESTOREを完全廃止しています。
CULLED Stateは、条件が再びRelevantになるまで保持します。
Target移動時は、そのTarget Objectに属するUnitだけを再判定します。
Occluder TransformまたはGeometry Change時は、現在CULLED中のUnitだけを再判定します。
Material / Rendered View Matrixが変化した場合も、CULLED Unitだけを再判定します。
CULLEDからACTIVEへ戻る場合は、最新W2Lを先に書き、その後Enabledを1へ戻します。
この順序はStale W2Lによる一瞬の古いReveal Mask表示を防止するため重要です。
Broad-phase State Machine
ACTIVE状態でBroad-phaseが「現在はRevealへ影響しない」と判定した場合、CULLEDへ移行します。
CULLEDではEnabled Socketを0にし、不要なW2L Writeを省略します。
時間が経過しただけではACTIVEへ戻しません。
Target、Occluder、Viewなどの条件変更により再びRelevantになった場合だけACTIVEへ戻します。
ACTIVE復帰時には最新W2Lを書き、その後Enabledを1へ設定します。
View-change Re-evaluation
CULLED Unitが存在するときだけView Signatureを監視します。
Draw PathではNodeTreeを書き換えません。
View MatrixのSignature変化だけを記録します。
その後Timer側でCULLED Unitを再判定します。
ACTIVE Unitしか存在しない場合は不要なView Re-evaluationを増やさない設計を維持します。
Occluder Material Wrapper
Occluderの既存Material Shaderを削除または置換してはいけません。
Reveal処理はWrapperとして挿入します。
Wrapper Nodeは「KJ_ETH_WRAPPER」Prefixで識別します。
Remove時にはWrapperを除去し、元のMaterial Connectionを可能な限り復元します。
Shared Material Isolation
isolate_shared_materialsはDefaultでONです。
ONの場合、Materialが他Objectでも共有されていればOccluder専用Copyを作成します。
非Occluder Objectが使うOriginal MaterialへReveal Wrapperを残さないことが重要です。
OFFの場合はOriginal Shared MaterialへReveal Wrapperを適用します。
Live Toggleとして動作し、切り替え時に可能な範囲で元状態へ戻します。
EEVEE Dithered Backup / Restore
set_ditheredはDefaultでONです。
ON時にはMaterialの既存Render状態をBackupした後、Ditheredを有効化します。
同じMaterialで繰り返しApplyしてもBackup元を上書きしてはいけません。
OFF時およびReveal Remove時にはPre-KJ状態へ戻します。
Geometry Refresh
Geometry Refreshでは、ObjectごとにEvaluated Meshを1回取得します。
そのObjectに所属するTarget Vertex Groupだけを再解析します。
Triangle CountやTopologyが互換ならConstant Updateを優先できます。
必要な場合だけTarget Surface Groupを再構築します。
Broad-phaseのACTIVE / CULLED Stateは可能な限り維持します。
Local Bounds Cacheも更新します。
Pure TransformとGeometry Refreshを混同してはいけません。


コメントを残す