Domanda

Ho un effetto particella semplice in OpenGL utilizzando GL_POINTS. Il seguente è chiamato, essendo passata particelle in ordine dalla più lontana particella dalla fotocamera prima di quella più vicina alla telecamera ultimo:

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);
}

Tuttavia, v'è una certa artifacting quando il rendering come si può vedere nella seguente effetto: immagine artifacted http://img199.imageshack.us/img199/9574/particleeffect.png

I problemi vanno via se disattivo il test di profondità, ma ho bisogno gli effetti di essere in grado di interagire con altri elementi della scena, che appare davanti e dietro elementi dello stesso GL_TRIANGLE_STRIP a seconda della profondità.

È stato utile?

Soluzione

Se i particules sono già ordinati si può rendere in questo modo:

  • Render particule con GL WRITE profondità, ma nessun test di profondità (non mi ricordo esattamente le costanti)
  • Render il resto della scena con test di profondità.

In questo modo si è sicuri di ottenere l'interazione scena con le particelle piacevole-osservare.

Altri suggerimenti

Nota: Si prega di specificare quale versione di OpenGL che si utilizza quando si posta domande. Questo vale per qualsiasi API. Quando si desidera rendere primitive con alpha blending, non si può avere le scritture di profondità abilitati. È necessario disegnare le primitive misti ordinati back-to-front. Se si dispone di oggetti opachi nella scena, li renda prima, e poi disegnare le primitive trasparenti in modo back-to-front ordinato con test di profondità attivato e la profondità scrive disabilitato.

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();
    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top