我正在研究一个模拟恒星盘动力学的 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 纹理。
你能给我一些线索来实时获得这种累积和部分透明度吗?