Pergunta

Eu tenho um efeito de partícula simples em OpenGL usando GL_POINTS. O seguinte é chamado, está sendo passado partículas, a fim da partícula mais distante da câmera pela primeira vez ao mais próximo a câmera última:

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

No entanto, há alguns artifacting ao renderizar como pode ser visto no seguinte efeito: imagem artifacted http://img199.imageshack.us/img199/9574/particleeffect.png

Os problemas vão embora se eu desativar testes de profundidade, mas eu preciso os efeitos de ser capaz de interagir com outros elementos da cena, aparecendo na frente e atrás de elementos do mesmo GL_TRIANGLE_STRIP dependendo da profundidade.

Foi útil?

Solução

Se seus particules já são classificadas você pode tornar assim:

  • Render particule com GL ESCREVA profundidade, mas nenhum teste de profundidade (não me lembro exatamente as constantes)
  • Render o resto da cena com teste de profundidade.

Desta forma, você tem certeza de obter a interação cena com partículas de aparência agradável.

Outras dicas

Nota: Por favor, especifique qual versão OpenGL você usa quando você postar perguntas. Isso vale para qualquer API. Quando você deseja processar primitivos com mistura alfa, você não pode ter gravações de profundidade ativado. Você precisa tirar suas primitivas misturadas classificadas back-to-front. Se você tem objetos opacos na cena, torná-los primeiro, e depois tirar suas primitivas transparentes em um back-to-front classificadas de moda com teste de profundidade habilitado e profundidade escreve desativado.

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();
    ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top