2

我正在研究一个模拟恒星盘动力学的 n 体代码。在渲染中,有两种类型的粒子:“经典”粒子(下图中的白色)和“暗物质”粒子(蓝色)。

这是模拟开始时的这张图片:

在此处输入图像描述

透明度似乎一切正常,但如果我在运行期间放大,我注意到实际上,一些粒子保持相同的中间颜色,即有紫色。

这是这张图片的一个例子(这是从侧面看到的星盘):

在此处输入图像描述

我的主要问题是我不明白为什么颜色不会随着后面的其他粒子而改变。例如,我希望一个白色/蓝色粒子被其他蓝色/白色粒子部分着色,并且是实时的。

我向您展示了我使用透明度的 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 回答