2013-05-05 8 views
0

У меня 2 trinagles с: координатамПонимание оси Z.

static float squareCoords[] = { 
    // red triangle 
    0.0f, 0.0f, 0.5f, 
    0.25f, 0.5f, 0.5f, 
    0.5f, 0.0f, 0.5f, 

    //black triangle 
    -0.1f, -0.1f, 0.1f, 
    0.15f, 0.4f, 0.1f, 
    0.4f, -0.1f, 0.1f, 
}; 

порядка прорисовки:

private short drawOrder[] = { 
      0, 2, 1, 
      3, 5, 4, 
    }; 

Затем я рисую его с glDrawElements и черный треугольник всегда перед красным. Изменение координат Z не имеет результатов. Похоже, он чертит черный трель второй, поэтому он всегда впереди. Помогите мне понять, что происходит и где проблема.

ответ

2

Возможно, вы не разрешаете тестирование глубины через glEnable(GL_DEPTH_TEST)?

В качестве альтернативы, ваша проекционная матрица может быть настроена так, что координаты Z становятся «скрюченными» вместе во время преобразования в нормализованные координаты устройства. Проверьте, что ваша ближняя и дальняя плоскости, и, возможно, вытащите дальнюю плоскость или ближайший самолет.

+0

Не существует матрицы проекций, GL_DEPTH_TEST. Таким образом, OpenGL просто рисует элементы по порядку, игнорируя координату z, если GL_DEPTH_TEST или матрица проекции не установлены? – Faceles

+0

Да; без объектов тестирования глубины внесет вклад в буфер кадров в порядке подачи, причем новые вещи переписывают старые вещи. Либо матрица проекции (в конвейерах с фиксированной функцией), либо действия шейдеров (в программируемых конвейерах, часто концепция матрицы проецирования сохраняется, просто запеченная в шейдер) определяют, какие входные координаты создают выходные координаты. В случае включения GL_DEPTH_TEST это преобразование в пространство вывода/NDC может привести к тому, что вещи будут «достаточно близки» к z-борьбе или порядку иначе, чем вы ожидали. – leander

+0

С помощью тестирования глубины новые объекты будут либо вносить вклад в буфер кадра, либо не на основе фрагмента, основываясь на том, какую функцию глубины ('glDepthFunc') вы используете. Таким образом, функция глубины по умолчанию - 'GL_LESS' -« Пропускает, если значение входящей глубины меньше хранимого значения глубины ». Это после преобразования - если вы смотрите вниз на ось -Z в мировых координатах, это означает, что значение * больше * z будет впереди. См. Также 'gluLookAt' и т. Д. =) – leander

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