Archived

This topic is now archived and is closed to further replies.

Fading from red to white

This topic is 5928 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I just recently wrote a particle engine but am having a problem with the colors of the particles. I would like a particle to start red, then fade to white. The problem is I don''t know how to do this smoothly. Any help or ideas? Jason Mickela ICQ : 873518 E-Mail: jmickela@sbcglobal.net ------------------------------ "Evil attacks from all sides but the greatest evil attacks from within." Me ------------------------------

Share this post


Link to post
Share on other sites
For each particle, set:

glColor3f(1.0f, particle.age, particle.age)

Where particle.age is a value between 0.0 (newborn) and 1.0 (dead). If age is to be a integer, you can use

glColor3f(1.0f, (float)particle.age / MAX_PARTICLE_AGEF, (float)particle.age / MAX_PARTICLE_AGEF)

If your particle is textured, you should ensure it's grayscale, or the colours might not be quite right.


Uuuuuulrika-ka-ka-ka-ka-ka

Edited by - Mayrel on October 25, 2001 11:38:58 AM

Share this post


Link to post
Share on other sites
Here's some code to support arbitary RGBA gradients.

    
typedef struct ps_colorband_s ps_colorband_t;
struct ps_colorband_s {
GLfloat start;
GLfloat end;
GLfloat c1[4];
GLfloat c2[4];
ps_colorband_t *next;
};

ps_colorband_t *_ps_cb = NULL;

GLvoid psAddColorBand4 (GLfloat start, GLfloat end,
GLfloat r1, GLfloat g1, GLfloat b1, GLfloat a1,
GLfloat r2, GLfloat g2, GLfloat b2, GLfloat a2)
{
ps_colorband_t *cb = malloc(sizeof(ps_colorband_t));
cb->start = start;
cb->end = end;
cb->c1[0] = r1; cb->c1[1] = g1; cb->c1[2] = b1; cb->c1[3] = a1;
cb->c2[0] = r2; cb->c2[1] = g2; cb->c2[2] = b2; cb->c2[3] = a2;
cb->next = _ps_cb;
_ps_cb = cb;
}

GLboolean psGetColorBand4 (GLfloat where, GLfloat *c)
{
ps_colorband_t *cb = _ps_cb;
GLfloat n;
int i;

/* For each colorband */
while (cb) {
/* If this point is between start and end, it's in the
* colorband. */
if ((cb->start <= where) && (cb->end >= where)) {
/* Normalises n between start and end: 0.0 is start,
* 1.0 is end. */
n = 1.0f / (cb->end - cb->start) * (where - cb->start);
for (i = 0; i < 4; ++i)
/* Compute the correct colour. */

c[i] = (cb->c2[i] * n) + (cb->c1[i] * (1.0f - n));
return TRUE;
}
cb = cb->next;
}

return FALSE;
}


I've tested something almost identical to this, but I don't have the code with me, so this version may have typos or bugs.

You use the code by first setting up the gradients:

  
psSetColorBand4(0.0,0.1, 1.0,1.0,1.0,1.0, 0.0,0.0,1.0,1.0);
psSetColorBand4(0.2,0.4, 0.0,0.0,1.0,1.0, 1.0,1.0,0.0,0.7);
psSetColorBand4(0.4,0.7, 1.0,1.0,0.0,0.7, 1.0,0.0,0.0,0.5);
psSetColorBand4(0.7,1.0, 1.0,0.0,0.0,0.5, 0.0,0.0,0.0,0.0);


This example produces particles that fade from white, to blue, to yellow to red to black. It's a fire gradient.

To set the color of each particle, use the following code:

  
Glfloat c[4];
...
for each particle
...
psGetColorBand4((float)particle.age / MAX_AGE, c);
glColor4fv(c);
...


Uuuuuulrika-ka-ka-ka-ka-ka

Edited by - Mayrel on October 25, 2001 12:10:15 PM

The syntax highlighter is delightfully naive.

Edited by - Mayrel on October 25, 2001 12:12:58 PM

Share this post


Link to post
Share on other sites