具有2D纹理的vbo - 实时透明度问题

时间:2012-11-06 04:39:30

标签: opengl transparency texture2d

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

这是模拟开始时的图像:

enter image description here

一切似乎都是透明的,但是如果我在跑步过程中放大,我注意到实际上,有些粒子保持相同的中间色,即有紫色。

以下是此图片的示例(从侧面看到的恒星盘):

enter image description here

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

我向你展示了我使用透明度的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纹理。

你能不能给我一些线索来实时获得这种累积和部分透明度?

1 个答案:

答案 0 :(得分:1)

确保禁用深度测试:

glDisable( GL_DEPTH_TEST );

然后,您可能想尝试不同的混合模式,例如添加剂混合:

glBlendFunc( GL_SRC_ALPHA, GL_ONE );

虽然添加剂混合非常漂亮,但它可能会产生太多的白色,这可能会破坏这种可视化的目的。您可以尝试降低glColor4f中的Alpha值。另一种解决方案是使用蓝色和红色粒子来突出差异。