首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >射线漫游:用适当的法线渲染Voxel网格

射线漫游:用适当的法线渲染Voxel网格
EN

Computer Graphics用户
提问于 2021-08-18 09:21:30
回答 1查看 598关注 0票数 0

亲爱的计算机图形学SE

我有一个RAYMARCHING渲染器,它从三维纹理中查找体素数据。纹理中的每个单元格可以是0或1。

我有一个非常简单的算法来计算空间中给定点p的符号距离。这是一些伪码

代码语言:javascript
复制
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):

代码语言:javascript
复制
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;



}

什么是最好的方式得到一个好的自卫队为我的体素场,这不会打破正常值?

EN

回答 1

Computer Graphics用户

发布于 2021-09-07 11:38:27

要估计点处的法线值,需要在点附近找到距离场的梯度。你需要的是变化的速度,而不是实际值。

代码语言:javascript
复制
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的值并不是一个正确的有符号距离字段,因此不清楚这是否有效。

票数 0
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/12143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档