2013-11-12 3 views
4

im играет с openGL и им пытается избавиться от синих отмеченных треугольников. Я использую для этого этот код:Почему openGL glDepthFunc() не работает?

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 
glEnable(GL_CULL_FACE); 

И да я использую

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

в моем главном цикле. Я читал, что проблема может быть проекционной матрицей. Я использую эти значения:

ProjectionMatrix = glm::perspective(45.5f, 4.0f/3.0f, 0.1f, 100.0f); 

Я пытался изменить ближнюю и дальнюю ценность, но все равно то же самое. Я также пытался изменить параметр glDepthFunc, но он также не помог мне. Итак, любые идеи? Большое спасибо

my result

ответ

7

Это вполне допустимо поведение, потому что вы не используете заполненные многоугольники. Отбраковка лица по-прежнему ведет себя так, как вы ожидали бы, когда используете glPolygonMode (...), но тест глубины - нет.

Испытание глубины и записи применяются только к фрагментам во время растеризации, а не к примитивам при сборке/примитиве. В двух словах это означает, что глубина примитива (например, треугольника) не будет затронута нигде, которая не заполнена. Таким образом, единственным критерием глубины, применяемым в этом примере, является очень мало точек на экране, где две линии перекрываются.

Если вы хотите, чтобы предотвратить каркасную накладку от рисования линий для треугольников, которые не будут обычно быть видимыми, вам нужно будет дважды рисовать:

Pass 1

  1. Установить режим Polygon для FILL
  2. Отключить цвет пишет: glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
  3. тиражная примитивы

Pass 2

  1. Установить режим Polygon на ЛИНИЯ
  2. Включить цвет пишет: glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
  3. тиражной примитивы

Это будет работать, потому что первый проход заполняет буфер глубины, используя заполненным (твердых) примитивов, но не записывает в цветовой буфер (при этом все остается прозрачным). Второй проход рисует линии по краям каждого примитива, и эти линии не пройдут проверку глубины, если внутренняя (незаполненная область) другого треугольника покрывает его.

ПРИМЕЧАНИЕ: Вы должны использовать глубинный тест, который включает в себя равенство (например, GL_LEQAUL) для правильной работы описанного выше поведения. Поэтому не используйте GL_LESS.

 Смежные вопросы

  • Нет связанных вопросов^_^