vbo с 2D текстурой - проблема с прозрачностью в реальном времени

Я работаю над кодом из 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 текстуру с черными квадратами фона.

Не могли бы вы дать мне несколько подсказок, как получить эту кумулятивную и частичную прозрачность в реальном времени?


person youpilat13    schedule 06.11.2012    source источник


Ответы (1)


Убедитесь, что вы отключили проверку глубины:

glDisable( GL_DEPTH_TEST );

Затем вы можете попробовать разные режимы смешивания, такие как аддитивное смешивание:

glBlendFunc( GL_SRC_ALPHA, GL_ONE );

Хотя аддитивное смешивание действительно красиво, оно может давать слишком много белого, что может свести на нет цель этой визуализации. Вы можете попробовать уменьшить альфа-значения в glColor4f. Другое решение - использовать синие и красные частицы, чтобы подчеркнуть разницу.

person num3ric    schedule 06.11.2012