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