Я работаю над кодом из 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 текстуру с черными квадратами фона.
Не могли бы вы дать мне несколько подсказок, как получить эту кумулятивную и частичную прозрачность в реальном времени?