문제
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();
...
}
제휴하지 않습니다 StackOverflow