2026年3月19日发售的游戏《红色沙漠(Crimson Desert)》的画面中某个要素正备受关注!
※2025/05/03 – 追加了与UE相关的信息
※2025/05/15 – 追加了视频和着色器代码
※2026/05/17 – 追加了SSDM的视频
《红色沙漠(Crimson Desert)》中墙面等的图形表现
看起来像Displacement,也像POM(视差遮蔽贴图)。
FR3NKD氏的X投稿
Crimson Desert has this surface shader..
It has a transformative effect on the game visuals and it's seemingly applied to every object in the game.
It doesn't look like tessellation, it appears to have artifacts from a screen-space effect.
I believe they are using the height… pic.twitter.com/CRBfw7SFte
— FR3NKD (@FR3NKD) April 2, 2026
这项技术的真身相当受关注。
是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中也有使用。
参考:CRYENGINE | Documentation – Silhouette POM – Shader Generation Params
参考:Parallax Occlusion Mapping with Silhouettes | Chetan Jags
参考:tncg14-parallax-mapping/documents/Parallax Mapping with Offset Limiting – A Per-Pixel Approximation of Uneven Surfaces.pdf at master · marcusstenbeck/tncg14-parallax-mapping · GitHub
另外,视频中也介绍了名为“PPOM(Prism Parallax Occlusion Mapping)”的技术,但它比较重,感觉实用性较低
PPOM(Prism Parallax Occlusion Mapping)

Prism Parallax Occlusion Mapping with Accurate Silhouette Generation | SI3D07_.pdf
结论来说是SPOM吗?
FR3NKD氏的X投稿
So, it's been a week since this discussion, multiple YouTube videos have been made discussing the mystery of this technique like the one from Next Level Game Art, EMC3D and Game World Art.
The general consensus is that this is SPOM so parallax occlusion mapping which also… https://t.co/tU78Skm3BD pic.twitter.com/Vv29TLskYL
— FR3NKD (@FR3NKD) April 10, 2026
FR3NKD氏也表示想在Godot中实现它呢
进一步搜索后发现
Amose05氏已经公开了面向Godot的SPOM着色器

参考:SPOM with horizon detection + self shading (Silhouette clipping Parallax Occlusion Mapping + Self shading + Horizon trimming / erosion) – Godot Shaders
参考:Improved SPOM with outline detection and self shadowing. – Godot Shaders(↑的改良版)
FR3NKD氏也打算以此为基础进行各种构建
Amose05 made a SPOM shader for Godot and posted it on godotshaders.
I tried it out and the results are interesting, it's a start! pic.twitter.com/q8Rbveuo4d
— FR3NKD (@FR3NKD) April 16, 2026
另外,Mestaria(@MestariaGame)氏已经在UE5中实现了类似方向的着色器
Got inspired and implemented this after a very long night wrapping my brain around it (Relaxed Cone Step Mapping instead of POM) in Unreal Engine 5 pic.twitter.com/PvcTvgmycp
— Mestaria (@MestariaGame) April 10, 2026
而且就在最近
UE5中构建SPOM的教程登场了!
kicol5氏讲解了如何在UE5的标准POM上追加支持,以再现SPOM
如果我接下来要尝试摸索的话
这个视频的公开真是太感谢了!
不过这种手法也并非完美无缺
在《红色沙漠(Crimson Desert)》中也能看到以下问题。
- 闪烁(抖动)
- 视角依赖的破绽
- 与深度不一致
FR3NKD氏的X投稿
Trippy pic.twitter.com/IeVKIMnwxy
— FR3NKD (@FR3NKD) April 2, 2026
很容易看出在画面边缘出现了破绽
FR3NKD氏的X投稿
Look at the edges of the screen: pic.twitter.com/TTPNJh54BR
— FR3NKD (@FR3NKD) April 2, 2026
这里在下方也被拉伸了
最后也来看看这段考察视频吧
考察视频:Crimson Desert Graphics Analysis | Is This Displacement Mapping or Parallax? by Game World Art
该视频使用ReShade分析了Crimson Desert的立体表现
从视差和位移两方面进行验证
根据对深度缓冲的影响以及轮廓的表现
指出它不只是POM单独作用,而是Pixel Depth Offset或
实际位移的可能性
不过并没有决定性证据
而是表明可能混合了多种技术
从这些渲染破绽和考察来看
这也可能是SPOM以外的技术吗?
我一边这么想一边在网络海洋里搜索时
在Reddit上看到了一个有趣的帖子
My mod guide to “fixing” current state of Crimson Desert (after 14hrs of tinkering and testing) : r/CrimsonDesert

哦…SSDM(Screen Space Displacement Mapping)
原来还有这种东西啊…
SSDM: Screen Space Displacement Mapping

SSDM: Screen Space Displacement Mapping | SSDM-RL08.pdf
SSDM(Screen Space Displacement Mapping)是
在屏幕空间上伪造凹凸的技术
它不是像普通POM那样移动UV,而是在场景绘制完成后
利用屏幕上的信息重新计算“挤出”效果
因此能够高速应用于整个场景
并且据说其优势还在于能影响到类似侧面这样的部分
在Unity论坛上,winning11123(David Gallagher)氏公开了将SSDM实装到Unity中的进度视频等内容
Screen Space Displacement Mapping (No Tesselation) – Progress – Community Showcases – Unity Discussions
关于这个SSDM
似乎也有过素材销售
但现在页面已经变成非公开了
不过相关视频已被热心人士重新上传,并且可通过网页存档查看当时的页面。
Screen Space Displacement Mapping (SSDM)
SSDM 2008年10月6日
- 比Parallax Occlusion Mapping 3.0更快
- 不依赖场景复杂度
- 移动物体的侧面
- 移动深度缓冲
- 不需要额外几何体
- 不需要预计算
- 支持按像素不均匀且动态的位移向量
(GeForce 8800GTS、全高清、全屏四边形)
POM 3.0:80 fps
SSDM: 110 fps
(GeForce 8800GTS、全高清、全屏圆环)
POM 3.0: 35 fps
SSDM: 110 fps
通过Wayback网页存档访问SSDM的解说文章
我个人觉得《红色沙漠(Crimson Desert)》可能是
以这个SSDM为基础的吧?
我是这么想的
买游戏
自己好好看不就行了吗?
是啊…
但关键的《红色沙漠(Crimson Desert)》我还没买呢…
我正在犹豫要不要为了看这个画面表现而买它…
为了一个本来就没打算买的游戏
花1万日元还是有点疼啊…
唉…
那么,欢迎提供技术信息!
2025年5月3日追加
出现了在UE中实现的人物!期待后续
Crimson Desert uses a screen-space displacement technique, which gave me some ideas for my projects. I though it was Silhouette POM and wanted to take a look into it, and honestly, why not push it further?#UnrealEngine5 #UE5 pic.twitter.com/LhMsrQDYoR
— Jhosep Chevarria (@Jhosep_gamer) April 5, 2026
Experimenting with Screen Space Displacement in UE5. Curious where this leads. (no SPOM) pic.twitter.com/ycNEbN1K9n
— Jhosep Chevarria (@Jhosep_gamer) May 1, 2026
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
我也以这个实现为基础试了一下
SPOM(Silhouette Parallax Occlusion Mapping
)的初次接触
太舒服了呀呀呀呀呀 #UE5Study #UE5不过果然《红色沙漠》应该还是SSDM(Screen Space Displacement Mapping)吧 pic.twitter.com/1EG2b7o7j9
— 3D人-3dnchu- CG情報ブログ (@ymt3d) May 15, 2026