亲爱的计算机图形学SE
我有一个RAYMARCHING渲染器,它从三维纹理中查找体素数据。纹理中的每个单元格可以是0或1。
我有一个非常简单的算法来计算空间中给定点p的符号距离。这是一些伪码
Let p be some vec3(x,y,z)
Let v = value of the 3D texture at point p (0 or 1)
If v == 1:
sdf=0.0
If v == 0:
sdf = cell_width/2.0这可以很好地找到射线和体素网格之间的交点,但这完全扰乱了法线。更具体地说,+x,+y,+z方向中的法线可以正常工作,但是应该在-x、-y、-z方向上的法线显示为vec3(0.0)。
以下是我的正常算法(glsl):
vec3 get_normal(vec3 intersection){
vec3 axis1 = intersection+vec3(1.0,0.0,0.0)*normal_epsilon;
vec3 axis2 = intersection+vec3(0.0,1.0,0.0)*normal_epsilon;
vec3 axis3 = intersection+vec3(0.0,0.0,1.0)*normal_epsilon;
float d1 = primary_sdf(axis1);
float d2 = primary_sdf(axis2);
float d3 = primary_sdf(axis3);
vec3 n = normalize(vec3(d1,d2,d3));
return n;
}什么是最好的方式得到一个好的自卫队为我的体素场,这不会打破正常值?
发布于 2021-09-07 11:38:27
要估计点处的法线值,需要在点附近找到距离场的梯度。你需要的是变化的速度,而不是实际值。
vec3 getNormal(vec3 p) {
return normalize(vec3(
getSDF(vec3(p.x + EPSILON, p.y, p.z)) - getSDF(vec3(p.x - EPSILON, p.y, p.z)),
getSDF(vec3(p.x, p.y + EPSILON, p.z)) - getSDF(vec3(p.x, p.y - EPSILON, p.z)),
getSDF(vec3(p.x, p.y, p.z + EPSILON)) - getSDF(vec3(p.x, p.y, p.z - EPSILON))
));
}然而,一组1和0的值并不是一个正确的有符号距离字段,因此不清楚这是否有效。
https://computergraphics.stackexchange.com/questions/12143
复制相似问题