如果您想了解它的工作原理,最好执行以下步骤:
1.首先你应该知道形状的定义
2. 最好考虑它们的 2D 形状,因为三个维度对您来说可能很复杂。
让我来解释一些形状:
圈子
圆是一个简单的封闭形状。它是平面中距给定点(中心)给定距离的所有点的集合。
您可以使用distance()、length() 或sqrt() 来计算到广告牌中心的距离。
The book of shaders - Chapter 7
方形
在几何学中,正方形是正四边形,这意味着它有四个相等的边和四个相等的角(90 度角)。
我描述了 2D 形状 在前面的部分现在让我来描述 3D 定义。
球体
球体是三维空间中的完美圆形几何对象,是一个完全圆形球的表面。
就像一个圆,它在几何上是二维空间中的一个对象,一个球体在数学上被定义为与给定点的距离 r 相同但在三维空间中的点的集合。
Refrence - Wikipedia
立方体
在几何学中,立方体是由六个正方形面、小平面或边组成的三维立体对象,每个顶点有三个交汇点。
Refrence : Wikipedia
使用距离函数建模
现在是时候了解modeling with distance functions
球体
如上节所述。在下面的代码中length() 用于计算到广告牌中心的距离,您可以通过s参数缩放此形状。
//Sphere - signed - exact
/// <param name="p">Position.</param>
/// <param name="s">Scale.</param>
float sdSphere( vec3 p, float s )
{
return length(p)-s;
}
框
// Box - unsigned - exact
/// <param name="p">Position.</param>
/// <param name="b">Bound(Scale).</param>
float udBox( vec3 p, vec3 b )
{
return length(max(abs(p)-b,0.0));
}
length() 像前面的例子一样使用。
接下来我们有max(x,0) 它叫Positive and negative parts
这意味着下面的代码是等效的:
float udBox( vec3 p, vec3 b )
{
vec3 value = abs(p)-b;
if(value.x<0.){
value.x = 0.;
}
if(value.y<0.){
value.y = 0.;
}
if(value.z<0.){
value.z = 0.;
}
return length(value);
}
步骤 1
if(value.x<0.){
value.x = 0.;
}
第二步
if(value.y<0.){
value.y = 0.;
}
第三步
if(value.z<0.){
value.z = 0.;
}
第四步
接下来我们有absolution函数。它用来移除额外的部分。
赦免步骤
赦免步骤1
if(value.x < -1.){
value.x = 1.;
}
赦免步骤2
if(value.y < -1.){
value.y = 1.;
}
赦免步骤 3
if(value.z < -1.){
value.z = 1.;
}
您还可以使用构造立体几何来制作任何形状。
CSG 建立在 3 个基本操作之上:交集 (∩)、并集 (∪) 和差集 (-)。
事实证明,当组合两个表示为 SDF 的表面时,这些操作都可以简洁地表达。
float intersectSDF(float distA, float distB) {
return max(distA, distB);
}
float unionSDF(float distA, float distB) {
return min(distA, distB);
}
float differenceSDF(float distA, float distB) {
return max(distA, -distB);
}