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