GLSL 效果示例
Mandelbulb:用距离估计渲染三维分形
从远景转到近景,展示迭代次数和细节的关系。
在线示例
修改右侧代码,左侧预览会实时更新。
观察什么
从远景转到近景,展示迭代次数和细节的关系。
实现原理
迭代球坐标幂映射并累积导数得到距离估计;这比球体成本高,预览限制迭代和步数。
找到控制效果的代码
vec3 z=p;float dr=1.,r=0.;for(int i=0;i<6;i++){r=length(z);if(r>2.)break;r=max(r,.0001);float theta=acos(clamp(z.z/r,-1.,1.)),phi=atan(z.y,z.x);dr=pow(r,7.)*8.*dr+1.;float zr=pow(r,8.);theta*=8.;phi*=8.;z=zr*vec3(sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta))+p;}return .5*log(max(r,.0001))*r/dr;
动手修改
把 scene 中分形循环的 i<6 降为 i<4。球状分形会减少细节,外层射线仍最多走 80 步,因此可单独查看分形迭代数的影响。
调试与成本
一次 scene 查询最多执行六次球坐标幂迭代,命中后的 normalAt 又需六次这样的查询。单独把主射线的 i<80 改成 i<40,可检查是否漏掉表面;它减少的是追踪预算,而非幂映射细节。