TL; DR:
我想使用Constructive Solid Geometry
制作Signed Distance Functions
个应用,但不确定如何在cpu
和kernel
之间拆分序列流程和并行流程。
我最近与Signed Distance Functions
和Ray marching
进行了很多探讨Metal
并尝试使用Constructive Solid Geometry
制作一个简单的Metal
。然而,经过多轮编码和阅读,我无法弄清楚如何实现这一目标。
问题:
所有SDF
示例都是一种硬编码,每次计算都在kernel
中完成。例如:
float map(float3 p){
float a = ball(p,1.0);
float b = ball(p+float3(1.0,0.0,0.0),1.0);
return min(a,b);
}
所以你会得到2个球并排坐着。 但我想在运行时动态添加,定位和旋转球。
Solution01:
所有map()
计算都将在swift
中完成,然后传递给kernel
进行处理。但这会很慢,因为您必须使用cpu
处理整个屏幕的计算,然后只传递给kernel
,这是使用kernel
的最佳工作,被cpu
抢劫。
Solution02:
将array
object
的所有属性发送至kernel
:
var objects = [{size:1.0,position:float3(0.0,0.0,0.0)},
{size:1.0,position:float3(1.0,0.0,0.0)}, ...]
然后使用for
中的map()
中的kernel
循环根据属性处理它:
float map(float3 p, float3 objects[]){//<-- objects[] is pseudo code for easy illustration purposes
float a;
for(int i = 1; i < objects.size(); i++){
a = min(ball(p + objects[i].position,objects[i].size),ball(p + objects[i-1].position,objects[i-1].size));
}
return a;
}
但是,我不确定这是否是正确的做法,因为for
循环可能会使kernel
过度工作。
Solution03:
在map()
中处理并编译cpu
,然后将整个函数发送到kernel
,然后(不知何故,我不确定如何)转换所有ray- marching
的函数} 使用。
我的问题:
采用哪种解决方案?
我个人感谢能否实施 Solution03 ,但我不确定是否可行。
Solution02 也不错。但是,当对象变得复杂时,for循环将太长。我不确定kernel
如何处理这个串行过程,而它最适合并行处理。
Solution01 也不错,如果我在发送到kernel
之前不必处理整个屏幕分辨率。
或者: 人们实际使用的其他任何方式,我都不知道?
Update01:
我只是测试 Solution02 ,在3个对象之后,FPS
下降到5,显然是不可接受的。