SDF & Marching Cubes & Ray-marching
SDF
SDF
(Signed Distance Field)有向距离场。SDF
是由到(多边形模型)物体表面最近距离的采样网格。作为惯例,使用负值来表示物体内部,使用正值表示物体外部。
Marching Cubes
marching cubes
算法是一种3D等值面表示技术。
SDF
(2D&3D)表达仅仅包含对二三维数据的表达,而并不是面片最终的表达。SDF是一种隐函数,如果需要对最终面片
进行表达,需要通过marching cubes
算法提取各个体素的面片。
示例
Sphere
// Radius of the world
const float Radius = 100.f;
// Normalize the position to get the 3D noise sample position
const FVector SamplePosition = FVector(X, Y, Z).GetSafeNormal();
// Compute noise. Note that the noise has a much higher frequency since the sample position is normalized
const float Height = Radius + Noise.GetPerlin_3D(SamplePosition.X, SamplePosition.Y, SamplePosition.Z, 1.f) * NoiseHeight;
// Value = DistanceFromCenter - Height
float Value = FVector(X, Y, Z).Size() - Height;
// Smoother gradient
Value /= 5;
return Value;
Heightmap
根据地形高度图生成体素地形
(Top+Side+Bottom)。
Ray-marching
Ray-Marching
,又叫光线步进的算法。这种算法在只提供像素着色器的情况下也能进行3D图形渲染。
光线行进是一种计算机图形绘制方法。 与其他使用纹理网格的绘制方法相比,光线行进算法在场景的符号距离场(SDF)表示上运行。
如果不需要对SDF进行面片
表达,可以使用Ray-marching
算法来表达SDF。
相关链接
- https://users.polytech.unice.fr/~lingrand/MarchingCubes/algo.html#msAmb
- https://www.cnblogs.com/skiwnchiwns/p/10345407.html
- https://docs.voxelplugin.com/v/1.2-legacy/getting-started/world-generation/world-generators
- https://github.com/kyle-rosa/ray_marching
- https://blog.csdn.net/mrbaolong/article/details/124414392
- https://michaelwalczyk.com/blog-ray-marching.html