forpoints ( position [, distance] ) { }
positionは空間内のポイントを意味するvectorです。このステートメントは、渡された位置におけるメタボール/パーティクル毎に一回実行されます。
distanceを指定すれば、指定したpositionからその距離の範囲内のすべてのメタボール/パーティクルのポイントが繰り返されます。distanceパラメータはオプションで、シェーダの実行が遅くなる場合があります。
ループ内にmdensityとmattribの関数をコールすれば、“blended”値を取得しなくても、現在のポイントの寄与度を調べることができます。
例えば、以下のコードは空間内のポイントの最大ウェイトに寄与しているメタボールのポイントカラーを受け取ります:
float d = 0, max = 0; vector clr = 0; vector blended_color; forpoints ( P ) { d = mdensity(P); if (d > max) { clr = mattrib("Cd", P); max = d; } blended_color = d * clr; }
forpoints
ループ内にmattribをコールする時、アトリビュートはメタボールのdensityで事前にブレンドされないことに注意してください。