恒星円盤のダイナミクスをモデル化する n 体コードに取り組んでいます。レンダリングでは、「クラシック」粒子 (下の画像の白) と「暗黒物質」粒子 (青) の 2 種類の粒子があります。
シミュレーション開始時のこの画像は次のとおりです。
透明度に関してはすべて問題ないように見えますが、実行中にズームすると、実際には一部の粒子が同じ中間色を保持していることに気付きます。つまり、紫色があります。
この画像の例を次に示します (これは側面から見た恒星円盤です)。
私の主な問題は、背後にある他の粒子の関数として色が変化しない理由を理解できないことです。たとえば、白/青のパーティクルが他の青/白のパーティクルによって部分的にシェーディングされ、リアルタイムで表示されるようにしたいと考えています。
透明度を使用する drawPoints() 関数を示します。
void drawPoints()
{
glEnable(GL_POINT_SPRITE);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_NV);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glEnable( GL_DEPTH_TEST );
glUseProgram(m_program);
glUniform1f( glGetUniformLocation(m_program, "pointRadius"), m_particleRadius );
glUniform1f( glGetUniformLocation(m_program, "pointScale"), m_pointScale );
GLuint vbo_disk;
glBindBuffer(GL_ARRAY_BUFFER, vbo_disk);
glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), pos);
glEnableClientState(GL_VERTEX_ARRAY);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glDrawArrays(GL_POINTS, 0, numBodies_disk);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableClientState(GL_VERTEX_ARRAY);
GLuint vbo_halo;
glBindBuffer(GL_ARRAY_BUFFER, vbo_halo);
glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), &pos[numBodies_disk]);
glEnableClientState(GL_VERTEX_ARRAY);
glColor4f(0.0f, 0.0f, 1.0f, 0.5f);
glDrawArrays(GL_POINTS, 0, numBodies_halo);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
glDisable(GL_POINT_SPRITE);
}
使ってみたglEnable( GL_DEPTH_TEST )
のですが、黒い背景の四角で2Dテクスチャを描画します。
この累積された部分的な透過性をリアルタイムで取得するための手がかりを教えてください。