金属着色语言 - SDF和Ray行进

时间:2017-04-25 00:32:55

标签: swift kernel cpu metal

TL; DR: 我想使用Constructive Solid Geometry制作Signed Distance Functions个应用,但不确定如何在cpukernel之间拆分序列流程和并行流程。

我最近与Signed Distance FunctionsRay 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,显然是不可接受的。

0 个答案:

没有答案