La transparencia alfa con efectos de partículas en OpenGL
Pregunta
I tienen un efecto de partícula simple en OpenGL usando GL_POINTS. El siguiente se llama, que se pasa partículas en orden desde el más alejado de partículas desde la cámara primera a la más cercana a la cámara pasada:
void draw_particle(particle* part) {
/* The following is how the distance is calculated when ordering.
* GLfloat distance = sqrt(pow(get_camera_pos_x() - part->pos_x, 2) + pow(get_camera_pos_y() - part->pos_y, 2) + pow(get_camera_pos_z() - part->pos_z, 2));
*/
static GLfloat quadratic[] = {0.005, 0.01, 1/600.0};
glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic);
glPointSize(part->size);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POINT_SPRITE_ARB);
glEnable(GL_TEXTURE_2D);
glBegin(GL_POINTS);
glColor4f(part->r, part->g, part->b, part->a);
glVertex3f(part->pos_x, part->pos_y, part->pos_z);
glEnd();
glDisable(GL_BLEND);
glDisable(GL_POINT_SPRITE_ARB);
}
Sin embargo, hay una cierta artifacting cuando se representa como se puede ver en el siguiente efecto: imagen artefactada http://img199.imageshack.us/img199/9574/particleeffect.png
Los problemas desaparecen si inhabilito la prueba de profundidad, pero necesito los efectos de poder interactuar con otros elementos de la escena, apareciendo en frente y detrás de los elementos de la misma GL_TRIANGLE_STRIP dependiendo de la profundidad.
Solución
Si sus particulas ya están ordenados se puede hacer así:
- Render particula con la profundidad GL escribir, pero hay pruebas de profundidad (no me acuerdo exactamente las constantes)
- Render el resto de la escena con la prueba de profundidad.
De esta manera usted está seguro de obtener la interacción escena con particulas de aspecto agradable.
Otros consejos
Nota: Por favor especificar qué versión de OpenGL se utiliza cuando se publique preguntas. Eso se aplica a cualquier API. Cuando se desea representar primitivas con mezcla alfa, no se puede tener escrituras de profundidad habilitadas. Que necesita para sacar sus primitivas combinadas ordenados de regreso a la delantera. Si tiene objetos opacos en la escena, hacerlos primero, y luego sacar sus primitivas transparentes de una forma de regreso a la parte delantera ordenados con la prueba de la profundidad y la profundidad permitido escribe con discapacidad.
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POINT_SPRITE);
glEnable(GL_CULL_FACE);
while(1)
{
...
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_BLEND);
glDepthMask(1);
RenderOpaque();
SortSprites();
glEnable(GL_BLEND);
glDepthMask(0);
DrawSprites();
...
}