質問
私は簡単な粒子の効果をOpenGLを用いGL_POINTS.以下のと呼ばれ、渡された粒子の粒子の最も遠からず先にカメラの最寄りはカメラの前:
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);
}
しかし、あartifactingレンダリング時に見られる以下の効果:artifacted画像http://img199.imageshack.us/img199/9574/particleeffect.png
の問題からはどんどん遠ざかっていく場を無効化深さもさんありがとうございます。影響することができ要素のシーンに登場する、その前後の要素と同じGL_TRIANGLE_STRIPります。
解決
ごparticulesでソートできる描画するようになります:
- 描画particuleと上記の深さも深さ試験(記憶してないの定数)
- 描画のシーンを深ます。
このようにするのではないでしょうかシーンとの相互作用の綺particules.
他のヒント
注:あなたが質問を投稿するときに使用され、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