2

恒星円盤のダイナミクスをモデル化する 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テクスチャを描画します。

この累積された部分的な透過性をリアルタイムで取得するための手がかりを教えてください。

4

1 に答える 1

1

深さテストを無効にしていることを確認してください。

glDisable( GL_DEPTH_TEST );

次に、加算ブレンドなどのさまざまなブレンド モードを試すことができます。

glBlendFunc( GL_SRC_ALPHA, GL_ONE );

加算ブレンディングは非常に美しいものですが、生成される白が多すぎて、このビジュアライゼーションの目的が損なわれる可能性があります。でアルファ値を下げてみてくださいglColor4f。別の解決策は、青と赤のパーティクルを使用して違いを強調することです。

于 2012-11-06T08:19:38.410 に答える