У меня 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 не имеет результатов. Похоже, он чертит черный трель второй, поэтому он всегда впереди. Помогите мне понять, что происходит и где проблема.
Не существует матрицы проекций, GL_DEPTH_TEST. Таким образом, OpenGL просто рисует элементы по порядку, игнорируя координату z, если GL_DEPTH_TEST или матрица проекции не установлены? – Faceles
Да; без объектов тестирования глубины внесет вклад в буфер кадров в порядке подачи, причем новые вещи переписывают старые вещи. Либо матрица проекции (в конвейерах с фиксированной функцией), либо действия шейдеров (в программируемых конвейерах, часто концепция матрицы проецирования сохраняется, просто запеченная в шейдер) определяют, какие входные координаты создают выходные координаты. В случае включения GL_DEPTH_TEST это преобразование в пространство вывода/NDC может привести к тому, что вещи будут «достаточно близки» к z-борьбе или порядку иначе, чем вы ожидали. – leander
С помощью тестирования глубины новые объекты будут либо вносить вклад в буфер кадра, либо не на основе фрагмента, основываясь на том, какую функцию глубины ('glDepthFunc') вы используете. Таким образом, функция глубины по умолчанию - 'GL_LESS' -« Пропускает, если значение входящей глубины меньше хранимого значения глубины ». Это после преобразования - если вы смотрите вниз на ось -Z в мировых координатах, это означает, что значение * больше * z будет впереди. См. Также 'gluLookAt' и т. Д. =) – leander