@TurboMartin
ich hatte es schon mal erklärt, aber ich wiederhohle es gerne.
Die Flammen werden Transparent gemalt.
Das Problem ist das ich nicht weis wie man das macht.
mementan geht es bei mir so
Delphi-Quellcode:
glShadeModel(GL_SMOOTH); // Povolí jemné stínování
glClearColor(0.0, 0.0, 0.0, 0.0); // Černé pozadí
glClearDepth(1.0); // Nastavení hloubkového bufferu
glDisable(GL_DEPTH_TEST); // Vypne hloubkové testování
glEnable(GL_BLEND); // Enable Blending
glBindTexture(GL_TEXTURE_2D, FFireTexture); // Vybere texturu
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // Type Of Blending To Perform
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Really Nice Point Smoothing
inc(ffpscount);
For i := 0 To high(fparticles) Do Begin
x := fparticles[i].x; // x pozice
y := fparticles[i].y; // y pozice
z := fparticles[i].z; // z pozice
// Setzen des Alpha Kanals
glColor4f(fparticles[i].r, fparticles[i].g, fparticles[i].b, fparticles[i].life);
// Wir malen jedes Paticel 2 Mal damit wir es bei Drehungen auch sehen.
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2d(1, 1);
glVertex3f(x + 0.1, y, z + 0.1);
glTexCoord2d(0, 1);
glVertex3f(x - 0.1, y, z + 0.1);
glTexCoord2d(1, 0);
glVertex3f(x + 0.1, y, z - 0.1);
glTexCoord2d(0, 0);
glVertex3f(x - 0.1, y, z - 0.1);
glEnd;
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2d(1, 1);
glVertex3f(x, y + 0.1, z + 0.1);
glTexCoord2d(0, 1);
glVertex3f(x, y - 0.1, z + 0.1);
glTexCoord2d(1, 0);
glVertex3f(x, y + 0.1, z - 0.1);
glTexCoord2d(0, 0);
glVertex3f(x, y - 0.1, z - 0.1);
glEnd;
If ffps <= ffpscount Then Begin
fparticles[i].x := fparticles[i].x + fparticles[i].xi / (fslowdown * 1000); // Pohyb na ose x
fparticles[i].y := fparticles[i].y + fparticles[i].yi / (fslowdown * 1000); // Pohyb na ose y
fparticles[i].z := fparticles[i].z + fparticles[i].zi / (fslowdown * 1000); // Pohyb na ose z
fparticles[i].xi := fparticles[i].xi + fparticles[i].xg; // Gravitační působení na ose x
fparticles[i].yi := fparticles[i].yi + fparticles[i].yg; // Gravitační působení na ose y
fparticles[i].zi := fparticles[i].zi + fparticles[i].zg; // Gravitační působení na ose z
fparticles[i].life := fparticles[i].life - fparticles[i].fade; // Sníží život o stárnutí
If (fparticles[i].life < 0.0) Then Begin
fparticles[i].life := 1.0;
fparticles[i].fade := (random(100) / 1000.0) + 0.015;
fparticles[i].x := 0.0;
fparticles[i].y := 0.0;
fparticles[i].z := 0.0;
fparticles[i].xi := (random(60) - 32.0) / 2;
fparticles[i].yi := (random(60) - 30.0) / 2;
fparticles[i].zi := (random(60) - 30.0) / 2;
End;
End;
End;
If ffps <= ffpscount Then
ffpscount := 0;
glDisable(GL_BLEND); // Disable Blending
glenable(GL_DEPTH_TEST); // Enable Dethtest
Wie man sieht ist das das Partikel Sample von Nehe.gamedev.net allerdings auf meine Bedürfnisse zugeschnitten und mit einem FPS Synchrinisierer.
Wenn du weist wie man es besser macht will ich mich gerne belehren lassen.