문제

gl_points를 사용하여 OpenGL에서 간단한 입자 효과가 있습니다. 다음은 카메라에서 가장 먼저 카메라에서 가장 가까운 입자에서 마지막으로 가장 가까운 입자에서 순서대로 순서대로 전달됩니다.

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

그러나 다음 효과에서 볼 수 있듯이 렌더링 할 때 아티팩트가 있습니다.인공물 이미지 http://img199.imageshack.us/img199/9574/particleffect.png

깊이 테스트를 비활성화하면 문제가 사라지지만 깊이에 따라 동일한 GL_TRIANGLE_STRIP의 요소 앞에 나타나는 장면의 다른 요소와 상호 작용할 수있는 효과가 필요합니다.

도움이 되었습니까?

해결책

입자가 이미 정렬 된 경우 다음과 같이 렌더링 할 수 있습니다.

  • GL 쓰기 깊이로 입자를 렌더링하지만 깊이 테스트는 없습니다 (정확히 상수를 기억하지 못함)
  • 나머지 장면을 깊이 테스트로 렌더링합니다.

이렇게하면 멋진 입자와 장면 상호 작용을 할 수 있습니다.

다른 팁

참고 : 질문을 게시 할 때 사용하는 OpenGL 버전을 지정하십시오. 그것은 모든 API에 적용됩니다. 알파 블렌딩으로 프리미티브를 렌더링하려면 깊이 쓰기를 활성화 할 수 없습니다. 혼합 프리미티브를 연속적으로 정렬해야합니다. 장면에 불투명 한 물체가있는 경우 먼저 렌더링 한 다음 깊이 테스트를 활성화하고 깊이가 비활성화 된 후 연속 정렬 된 방식으로 투명한 프리미티브를 그립니다.

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();
    ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top