OpenGLES 2.0 (GLKit, iPhone): полигоны частично закрывают линии каркаса

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

пример частично скрытых линий

Рисование только линий работает просто отлично — линии имеют правильную толщину. Если я отключу буферизацию глубины для линий, они также будут отображаться правильно, но они, конечно, появятся над всеми полигонами (то есть линиями, которые действительно скрыты полигонами). Я также пытался уменьшить прозрачность полигонов, но безрезультатно. Немного увеличивая координаты 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, и я не уверен, что это может повлиять на производительность, так как этот сдвиг зависит от текущего положения камеры. Можно ли динамически применять преобразование к линиям непосредственно перед их рисованием?


person MrMage    schedule 26.12.2011    source источник


Ответы (1)


Ознакомьтесь с glPolygonOffset. Он сделан специально для этого использования.

person Skyler Saleh    schedule 26.12.2011
comment
Это сделало трюк! Большое спасибо! Теперь осталось выяснить оптимальные для него параметры. - person MrMage; 26.12.2011