着色粒子

ParticleBlinkScriptノードを使用して、パーティクルの年齢や速度などに応じてパーティクルの色を変更できます。次のカーネル例では、パーティクルの存続期間中にパーティクルの色を変更します。4色の個々のノブが作成され、Catmull-Romスプラインを使用して、粒子の経年変化に合わせて色の間をスムーズに補間します。

次の粒子着色カーネルの結果の効果

次のカーネルのノードグラフの例

kernel ParticleColorKernel : ImageComputationKernel<ePixelWise>

{

Image<eReadWrite> p_color;

Image<eReadWrite> p_startTime;

Image<eReadWrite> p_life;

 

param:

float4 _color1;

float4 _color2;

float4 _color3;

float4 _color4;

float _systemTime;

 

local:

float4 _colors[6];

 

void define() {

defineParam(_color1, "pa_color1", float4(1.0f, 0.0f, 0.0f, 1.0f));

defineParam(_color2, "pa_color2", float4(1.0f, 0.0f, 0.0f, 1.0f));

defineParam(_color3, "pa_color3", float4(1.0f, 0.0f, 0.0f, 1.0f));

defineParam(_color4, "pa_color4", float4(1.0f, 0.0f, 0.0f, 1.0f));

defineParam(_systemTime, "_systemTime", 0.0f);

}

 

void init() {

//スプライン接線の最初と最後の色を繰り返します

_colors[0] = _color1;

_colors[1] = _color1;

_colors[2] = _color2;

_colors[3] = _color3;

_colors[4] = _color4;

_colors[5] = _color4;

}

 

// Catmull-Romスプライン

float4 spline(float x, int numKnots)

{

int numSpans = numKnots - 1;

 

float t = max(0.0f, min(1.0f, x)) * (numSpans-2);

int span = int(floor(t));

t -= span;

 

float4 k0 = _colors[span];

float4 k1 = _colors[span+1];

float4 k2 = _colors[min(numSpans, span+2)];

float4 k3 = _colors[min(numSpans, span+3)];

 

return 0.5f*(2.0f*k1

+ (-k0 + k2)*t

+ (2.0f*k0 - 5.0f*k1 + 4.0f*k2 - k3)*t*t

+ (-k0 + 3.0f*k1 - 3.0f*k2 + k3)*t*t*t);

}

 

void process() {

float t = (_systemTime-p_startTime())/p_life();

p_color() = spline(t, 6);

}

};