我一直在寻找并试图理解下面的代码
float sdBox( vec3 p, vec3 b )
{
vec3 d = abs(p) - b;
return min(max(d.x,max(d.y,d.z)),0.0) +
length(max(d,0.0));
}
Run Code Online (Sandbox Code Playgroud)
我理解length(d)
处理SDF的情况,其中点离开'拐角'(即所有组件d
都是正的)并且max(d.x, d.y, d.z)
在所有其他情况下给我们适当的距离.我不明白的是,如果不使用if语句检查d
组件的符号,这两者是如何组合在一起的.
当所有d
组件都是正数时,返回表达式可以减少到length(d)
因为min/max
评估的方式- 当所有d
组件都是负数时,我们得到max(d.x, d.y, d.z)
.但我怎么理解中间案件呢?那些组成部分d
有混合迹象的那些?
我一直试图把它绘制成无济于事.如果有人能用几何/数学术语向我解释,我真的很感激.谢谢.
我正在尝试使用光线行进渲染球体网格。SDF 函数如下所示:
float sq_layer(vec3 p, vec3 bounding_box_min, vec3 bounding_box_max)
{
float cell_size = 4.0 / 16.0;
vec3 p0 = clamp(p.xyz, bounding_box_min, bounding_box_max);
p0 = mod(p0, cell_size) - cell_size * 0.5f;
float d_pt = sphereSDF(vec3(p0.x, p0.y, p0.z), 0.05f)
return d_pt;
}
Run Code Online (Sandbox Code Playgroud)
为了获得更多相关性,我尝试稍微更改一下代码:
float sq_layer(vec3 p, vec3 bounding_box_min, vec3 bounding_box_max)
{
vec3 cell_size = (bounding_box_max - bounding_box_min) / 4.0;
vec3 p0 = clamp(p.xyz, bounding_box_min, bounding_box_max);
p0 = mod(p0, cell_size) - cell_size * 0.5f;
float d_pt = boxSDF(p0, cell_size * 0.35);
return …
Run Code Online (Sandbox Code Playgroud) 我正在建立一个射线游行者来查看像mandelbox等的东西.它很棒.然而,在我目前的程序中,它使用每个工作人员作为从眼睛投射的光线.这意味着每个工作人员执行大量执行.因此,当查看一个非常复杂的对象或尝试以足够大的精度进行渲染时,会导致我的显示驱动程序崩溃,因为内核在单个工作程序上执行时间太长.我试图避免更改我的注册表值以使超时更长,因为我希望此应用程序在多台计算机上工作.
有什么方法可以解决这个问题吗?目前,每个工作项的执行完全独立于附近的工作项.我已经考虑过向GPU订阅缓冲区,该缓冲区将存储当前进度并仅执行少量迭代.然后,我会反复调用该程序,结果有望进一步完善.这个问题是我不确定如何处理分支射线(例如反射和折射),除非我有预期的最大数量.
任何人都有任何指示我应该怎么做来解决这个问题?我是OpenCL的新手,并且已经有很长一段时间了.我觉得好像我做错了或主要滥用OpenCL,因为我的单个工作项背后有很多逻辑,但我不知道如何拆分任务,因为它只是一系列步骤和检查和调整.