我使用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);
}
但是,渲染时会出现一些瑕疵,如以下效果所示:artifacted image http://img199.imageshack.us/img199/9574/particleeffect.png
如果我禁用深度测试,问题就会消失,但是我需要效果能够与场景的其他元素进行交互,根据深度出现在同一个GL_TRIANGLE_STRIP元素的前面和后面。
答案 0 :(得分:3)
如果您的粒子已经分类,您可以这样渲染:
通过这种方式,您可以确保通过漂亮的细节进行场景交互。
答案 1 :(得分:2)
注意:请指定发布问题时使用的OpenGL版本。这适用于任何API。 如果要使用Alpha混合渲染基元,则无法启用深度写入。您需要绘制从前到后排序的混合基元。如果场景中有不透明对象,请先渲染它们,然后以后向前排序的方式绘制透明图元,并启用深度测试并禁用深度写入。
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();
...
}