OpenGLES 2.0 (GLKit, iPhone): полигоны частично скрывают каркасные линии - PullRequest
0 голосов
/ 26 декабря 2011

Я пытаюсь создать 3D-плоттер для iOS. Мне удалось визуализировать график с использованием треугольных полос, а также реализовал рисование каркаса через линии. Но если я выполняю рендеринг обоих одновременно с использованием 24-битного (или 16-битного) буфера глубины, линии будут частично скрыты полигонами, что сделает их очень тонкими или полностью исчезнет. Отключение 4xMSAA не решает проблему. См. Изображение ниже для примера.

example of partially obscured lines

Рисование только линий работает отлично - линии имеют правильную толщину. Если я отключаю буферизацию глубины для линий, они также отображаются правильно, но они, конечно, появляются над всеми полигонами (то есть линиями, которые действительно скрыты полигонами). Я также пытался уменьшить прозрачность полигонов, но безрезультатно. Незначительное увеличение y-координат линий делает их лучше, если вы смотрите на них сверху, так что они действительно перед полигонами.

Для оптимальной производительности я статически сохраняю все данные вершин и индексы в массивах вершин перед рендерингом. Таким образом, мой цикл рендеринга довольно короткий:

- (void)drawRect:(CGRect)rect
{
    glClearColor(1, 1, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    [self.effect prepareToDraw];

    for (NSUInteger i = 0; i < _nVertexArrays; i ++)
    {
        glBindVertexArrayOES(_vertexArrays[i].vertexArray);
        glDrawElements(_vertexArrays[i].mode, _vertexArrays[i].indexCount, GL_UNSIGNED_INT, NULL);
    }
}

Как правильно отображать полигоны и каркасы одновременно? Я также думал о том, чтобы просто переместить линии немного ближе к тому месту, где сейчас находится камера, но я не знаю, как это сделать в OpenGL ES, и я не уверен, может ли это повлиять на производительность, как это смещение зависит от текущего положения камеры. Можно ли динамически применить преобразование к линиям непосредственно перед их рисованием?

1 Ответ

2 голосов
/ 26 декабря 2011

Проверить glPolygonOffset . Это сделано специально для этого использования.

...