Substance Painter スキルアップ集中講座 <背景アセット編> 「なんとなく知っている」から「使える」へ。基本機能を総ざらい! #ポリゴンナイト | CREATIVE VILLAGE SEMINAR

Join Mirror Mesh v1.0 | Rig&Tool専門会社Stud...

Rig&Tool専門会社STUDIO JOINによる、Maya向けBlendShapeミラーリングツール「Join Mirror Mesh v1.0」が無料配布されています!

続きを読む

VBAO - Visibility Bitmask Ambient Occlus...

ARK.KRAによる、Unreal Engine 5向けのAOプラグイン「VBAO - Visibility Bitmask Ambient Occlusion」がFab上でリリースされていました!

続きを読む

REAL FLARES v1.0 | 柔軟にカスタマイズ可能なレンズフレアエフェ...

TXC STOCKによる、Unreal Engine 5向けのレンズフレアエフェクトツールスイートプラグイン「REAL FLARES v1.0」がFab上でリリースされています!

続きを読む

【PR】High-End Photorealistic Character Cr...

韓国のフリーランスCGアーティスト Lee JeongHyeon氏による、Unreal Engine 5とZBrushを使用したリアルなキャラクター制作解説コース「High-End Photorealistic Character Creation: Modern Reality in UE5」がCG&デジタルアート関連チュートリアルサービスWingfoxにて取り扱いされています!

続きを読む

ZOZO's Contact Solver Blender Add-on 202...

ZOZOTOWNなどでお馴染み株式会社ZOZOによるオープンソースの物理シミュレーション接触ソルバーのBlenderアドオン「ZOZO's Contact Solver Blender Add-on 2026」がリリースされました!

続きを読む

紅の砂漠(Crimson Desert)で注目の疑似立体表現!技術の真相は?SPOM (Silhouette parallax occlusion mapping)?SSDM(Screen Space Displacement Mapping)?GodotやUE5でのシェーダー情報など!

この記事は約11分20秒で読めます

2026年3月19日にリリースされたゲーム「紅の砂漠(Crimson Desert)」のグラフィックのとある要素に注目が集まっています!

※2025/05/03 – UEに関する情報を追記
※2025/05/15 – 動画とシェーダーコードを追加
※2026/05/17 – SSDMの動画を追加

「紅の砂漠(Crimson Desert)」の壁などのグラフィック表現
Displacementにも見えるし、POM(視差オクルージョンマッピング)にも見える。

FR3NKD氏のX投稿

この技術の正体がかなり話題になっています。
SPOM (Silhouette parallax occlusion mapping)なの?
PPOM(Prism Parallax Occlusion Mapping)なの?
SSDM(Screen Space Displacement Mapping)?
ということで幾つも考察動画が幾つか公開されています。

考察動画:How Crimson Desert Fakes Realism (It’s Genius)
by Next Level Game Art

当初はディスプレイスメントやPOM(パララックス)と考えられていましたが
通常のPOMでは再現できない“シルエットの立体感”が確認されており
従来の手法だけでは説明できない点を指摘
ReShadeを使用し
最終的にSPOMまたはSilPOM(シルエット対応POM)の可能性が有力とされています。

考察動画:The Walls of Crimson Desert – Parallax VS Displacement (New Findings)
by EMC3D – Game Art

ワイヤーフレーム解析から
通常のディスプレイスメントでは成立しない点を指摘
その上で、2000年代の論文やCryEngineの実装例をもとに
こちらもシルエットを生成可能な拡張パララックス手法(SPOM系)の存在を提示

ということで多数登場したSPOMという技術について紹介

SPOM(Silhouette Parallax Occlusion Mapping)

SPOM(Silhouette Parallax Occlusion Mapping)は、
従来のParallax Occlusion Mappingにシルエット表現を追加した技術で、
軽量なまま高密度な立体表現を実現できるのが特徴です。

通常のPOMでは、見た目に奥行きは出せても「輪郭は平面のまま」という制約がありますが、SPOMではこの問題を改善し、エッジ部分にも立体感を持たせることが可能になっています。

考察動画でも取り上げられた通り
実はこの技術自体は2000年代から存在しており
CryEngineでも使われていたりしています。

またその他に動画内でも紹介された「PPOM(Prism Parallax Occlusion Mapping)」という技術も存在するのですがこちらは重めなので実用性は低そうな印象

PPOM(Prism Parallax Occlusion Mapping)

結論としてはSPOMでしょうか?

FR3NKD氏のX投稿

FR3NKD氏もGodotで実装したいと仰られてますね

さらに探してみると
Amose05氏が既にGodot向けSPOMのシェーダーを公開しています

FR3NKD氏もこれをベースに色々構築するみたい

そしてMestaria(@MestariaGame)氏はUE5で似た方向性のシェーダーを実装

またつい最近ですが

UE5でSPOMを構築するチュートリアルが登場!

kicol5氏はUE5の標準のPOMに追加対応を行いSPOMを再現する方法を解説しています

私がこれから試行錯誤しようと思ったら
この動画公開はとても有り難い!

一応この手法、ただ完璧というわけではなく
「紅の砂漠(Crimson Desert)」では下記課題も見受けられます。

  • フリッカリング(チラつき)
  • 視点依存の破綻
  • 深度との不整合
FR3NKD氏のX投稿

画面端で破綻しているのがわかりやすい

FR3NKD氏のX投稿

こちらも下部で伸びてます

最後にコチラの考察動画もみてみましょう

考察動画:Crimson Desert Graphics Analysis | Is This Displacement Mapping or Parallax? by Game World Art

この動画では、Crimson Desertの立体表現をReShadeを使い分析し
パララックスやディスプレイスメントの両面から検証しています
深度バッファに影響が見られる点や、シルエットの挙動から
POM単体ではなくPixel Depth Offsetや
実際のディスプレイスメントの可能性が指摘
ただし決定的な証拠はなく
複数の技術が組み合わさっている可能性を示しています

これらの描画破綻や考察を見ている感じですと
これはSPOM以外の技術の可能性もあるのかなぁ?
と思いネットの海を漁っていたところ
Redditで興味深い投稿がありました

ほぅ…SSDM(Screen Space Displacement Mapping)
というものがあるんだな…

SSDM: Screen Space Displacement Mapping

SSDM(Screen Space Displacement Mapping)は
画面上(スクリーンスペース)で擬似的に凹凸を作る技術です
通常のPOMのようにUVをずらすのではなく、一度シーンを描画したあとに
画面上の情報を使って“押し出し”を再計算するのが特徴です
そのためシーン全体に対して高速に適用でき
側面のような部分にも影響を与えられる点が強みとされています


Unityのフォーラムではwinning11123(David Gallagher)氏がSSDMをUnityに実装している方の進捗動画などを公開しています

このSSDMに関しては
アセット販売も行われていた形跡があるのですが
現在はページが非公開になっているみたいです

ただ動画を有志の方が再アップロードしつつ、ウェブ魚拓にて当時のページが閲覧可能です。

Screen Space Displacement Mapping (SSDM)

SSDM 2008年10月6日

  • パララックスオクルージョンマッピング3.0よりも高速
  • シーンの複雑さに依存しない
  • オブジェクトの側面をずらす
  • 深度バッファをずらす
  • 追加のジオメトリを必要としない
  • 事前計算を必要としない
  • ピクセル単位の不均一で動的な変位ベクトルに対応

(GeForce 8800GTS、フルHD、フルスクリーン・クワッド)
POM 3.0:80 fps
SSDM: 110 fps
(GeForce 8800GTS、フルHD、フルスクリーン・トーラス)
POM 3.0: 35 fps
SSDM: 110 fps

個人的に「紅の砂漠(Crimson Desert)」
このSSDMをベースにしているんじゃないかなー?
と想像しています

ゲーム買って
自分でちゃんと見たらいいんじゃね?

そうなんですよね…
肝心の「紅の砂漠(Crimson Desert)」ですが
私は購入してないんですよね…
このグラフィック表現を見るために買うか悩んでいるところです…

買う予定のないゲームに
1万円ってちょっと痛いじゃないですか…

はぁ…

ということでどなたか技術情報お待ちしてます!

2025年5月3日追記

UEで実装をされている方が登場!続報に期待

2025年5月15日追記

更に色々考察動画やUE実装が増えてきたみたいで、簡単にUEで実装する解説が更に増えていました。
プロジェクトファイルとシェーダーコードも共有されています

Unreal Engine 5 Just Got INSANE… (Crimson Desert Effect Recreated)

この方独自の改善版POMプロジェクトと、それに対してSPOM対応する為のUE用カスタムシェーダーコードが共有されています!

float OpacityMask = 1.0f; // Default: pixel is visible

if (EnableSilhouette > 0.5f)
{
    float2 offset = POMOffset; // Start with the raw POM displacement offset

    // POM offset is in rotated UV space — undo the rotation so it aligns with the raw mesh UVs
    if (RotationAngle != 0.0f)
    {
        float angle_rad = -RotationAngle * 6.28318f; // Negative angle = inverse rotation. Multiply by 2π to convert from UE's 0-1 range to radians
        float cosA = cos(angle_rad);
        float sinA = sin(angle_rad);
        offset = float2(
            POMOffset.x * cosA - POMOffset.y * sinA, // Standard 2D rotation matrix applied to the offset vector
            POMOffset.x * sinA + POMOffset.y * cosA
        );
    }

    // POM offset is in tiled UV space (e.g. 0-2 for tiling=2). Divide by tiling to normalize it back to 0-1 mesh UV space
    offset /= max(TileAmount, float2(0.001f, 0.001f)); // max prevents division by zero

    // Project where POM would push this pixel in raw mesh UV space
    float2 effectiveUV = RawMeshUV + offset;

    // Check distance from each edge — negative value means we've overshot past the mesh boundary
    float2 minCheck = effectiveUV - SilhouettePadding;           // How far past the 0 edge (left/bottom)
    float2 maxCheck = (1.0f + SilhouettePadding) - effectiveUV;  // How far past the 1 edge (right/top)

    // Collapse to single values — the most violated edge wins
    float minVal = min(minCheck.x, minCheck.y);
    float maxVal = min(maxCheck.x, maxCheck.y);

    // If either check went negative, POM pushed past a mesh edge — clip this pixel to create the silhouette
    OpacityMask = (minVal >= 0.0f && maxVal >= 0.0f) ? 1.0f : 0.0f;
}

return float3(FinalUV.x, FinalUV.y, OpacityMask); // .xy = UVs passthrough, .z = silhouette mask for opacity

私もこの実装をベースに触ってみました

コメントをお待ちしています。

コメント

日本語が含まれない投稿は無視されます。-Posts that do not include the Japanese will be ignored-(スパム対策-anti Spam-)

3D人-3dnchu-

3D/2D/VR/GAME/AIなどのCGに関連する個人的に気になる情報をほぼ毎日紹介!XやYoutubeなども是非フォローよろしくお願いします!
※当サイトのリンクにはアフィリエイトを含みます

※当サイトの一部記事にはアフィリエイトが含まれております。

スポンサープロダクト


X-Ray Realtime Light and TexturingTool

CGElementaryに関する記事一覧


Character Creator - アニメーション、ゲーム、AR/VR のための 3D キャラメイクソフト

Reallusionに関する記事一覧


Paintstorm Studio

Paintstorm Studioに関する記事一覧


MarvelousDesigner

MarvelousDesignerに関する記事一覧


JangaFX - Real-Time VFX Software For Real-Time VFX Artists

JangaFXに関する記事一覧


パルミーの講座が見放題!月謝制お申し込み|お絵かき講座パルミー

Palmieに関する記事一覧


《ドラゴン》―複雑な生き物モデリングとマップ作成技術のコース【Japanese】

WINGFOXに関する記事一覧


Meshy - Free AI 3D Model Generator

Meshyに関する記事一覧


アーカイブ

カテゴリ

おすすめ商品Pickup

注目の記事

PR


PR






   
USD
3D人のLINEアカウントを作りました!
友だち追加


follow us in feedly

RSSリーダーで購読する


ほしい物リスト公開中!
3D人運営に援助!
Amazonでリストを見る

Discordチャンネル公開

pixivFUNBOXページ公開!




おすすめ商品Pickup

おすすめ記事

ページ上部へ戻る