OpenGL - Вопрос об использовании glDepthMask

Я представил objectA в сцене следующим образом. Сцена имеет много других объектов также.

void Draw()
{    
    if( glIsList( displayListID ) )
    {
        glPushAttrib( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ENABLE_BIT );

        glEnable( GL_BLEND );
        glEnable( GL_DEPTH_TEST );
        //glDepthMask( GL_FALSE );
        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

        glEnable( GL_LINE_SMOOTH );
        glEnable( GL_POINT_SMOOTH );
        glEnable( GL_POLYGON_SMOOTH );

        glMatrixMode( GL_MODELVIEW ); 

        color.setAlpha(alpha); // set alpha transparent of this objectA
        glCallList( displayListID );

        //glDepthMask( GL_TRUE );
        glDisable( GL_BLEND );  

        glPopAttrib();
    }
}

Теперь вот проблема,

Как показано я комментирую две строки//glDepthMask (GL_FALSE);//glDepthMask (GL_TRUE);

сцена представляет objectA и другие объекты правильно подробно. Однако модификация objectA альфы больше не работает (т.е. color.setAlpha (альфа)).

Если я некомментирую вышеупомянутые две строки, то альфа-модификация вернулась для работы. Однако рендеринг глубины не корректен. Другими словами, иногда, objectA должен быть позади других объектов, но похоже, что objectA перед всеми объектами.

Как я решаю эту проблему?

Спасибо

18
задан q0987 2 August 2010 в 13:39
поделиться

2 ответа

  1. Включить маску глубины glDepthMask (GL_TRUE)
  2. Рисовать все непрозрачные объекты в любом порядке
  3. Отключить маску глубины glDepthMask (GL_FALSE)
  4. Включите BLEND_MODE
  5. Рисуйте полупрозрачные объекты, отсортированные от наиболее удаленных до ближайших

Почему вы это делаете?

Их 2 буферы, о которых вам нужно беспокоиться: буфер глубины и буфер цвета . Эти буферы на самом деле представляют собой просто большие 2-мерные массивы, каждый шириной x высотой вашего экрана.

Цветовой буфер , естественно, будет содержать окончательную окраску каждого пикселя. В цветном буфере есть одна запись на пиксель экрана. Буфер глубины похож на буфер цвета в том, что на пиксель экрана приходится одна запись, но он используется для чего-то другого. Записи в буфере глубины являются мерой того, «насколько близко» на самом деле находится каждый цветной пиксель.

Если вы визуализируете 1 треугольник, который находится далеко от камеры, он генерирует набор цветов и значений глубины для каждого пикселя, который он «хочет» покрыть на экране. Предположим, вы затем визуализируете другой поли, который находится ближе, он также сгенерирует набор значений для буферов глубины и цвета. Теперь есть своего рода «соревнование» во время окрашивания пикселей, когда «более удаленные» фрагменты (значения буфера большой глубины) отбрасываются, и сохраняются только самые близкие фрагменты. Более близкие фрагменты окрашивают пиксель, который у вас был.(Когда два полигона почти перекрываются, может произойти Z-борьба )

Начните с визуализации объектов в вашей сцене с включенной маской глубины. Это означает, что каждая форма, которую вы визуализируете, когда ее пиксели окрашиваются, буфер глубины обновляется с указанием «победителя» конкурса.

Затем вы 3) glDepthMask (GL_FALSE) отключает буфер глубины для записи, 4) включаете смешивание, 5) визуализируете полупрозрачные формы от самых дальних до ближайших. Кажется странным, да?

Когда вы выключаете маску глубины и визуализируете полупрозрачные формы, OpenGL все равно считывает буфер глубины, чтобы определить, какие фрагменты выбросить (например, если ваша полупрозрачная форма находится позади уже созданную твердую фигуру, затем вы выбрасываете фрагменты этой полупрозрачной фигуры). Но он не будет записывать в буфер глубины, поэтому, если полупрозрачная форма действительно очень близка к глазам (скажем, как полупрозрачное лобовое стекло), эти фрагменты ветрового стекла не будут предотвращение отрисовки других фрагментов, которые фактически находятся дальше . Это важно, потому что если ваше лобовое стекло находится прямо перед вами и вы делаете его полупрозрачным, то и вы позволяете фрагментам лобового стекла обновлять буфер глубины, тогда вы не увидите в своей сцене ничего, кроме лобового стекла, даже хотя за ним скрываются формы, потому что OpenGL подумает: «Эй, это лобовое стекло - единственное, что должен видеть пользователь из-за этих значений буфера глубины, поэтому я не буду беспокоиться о рендеринге чего-либо дальше, чем это лобовое стекло.«Отключение маски глубины - это способ« обмануть »OpenGL, чтобы он« не знал », что есть очень близкие, но полупрозрачные фрагменты.

67
ответ дан 30 November 2019 в 05:49
поделиться

Одно из возможных решений: всегда установить glDepthMask на GL_TRUE и сначала отрисовать все непрозрачные объекты (в любом порядке, как вы это делаете сейчас), затем нарисуйте все ваши (полупрозрачные) объекты, отсортированные от задней части к передней.

В некоторых случаях, если вам не важен порядок, в котором отображаются ваши (полу) прозрачные объекты, и вы хотите, чтобы другие непрозрачные объекты только «просвечивали», вы можете пропустить сортировку ваших (полу) ) прозрачные объекты.

3
ответ дан 30 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: