Я пишу симулятор полета и застрял в классической проблеме этого жанра: ближняя плоскость поля зрения должна быть достаточно близко, чтобы сделать кабину самолета видимой, дальний самолет должен быть далеко, чтобы обеспечить видимые расстоянияс длиной до 40 км.
Расстояние видимости или отношение ближнего / дальнего радиуса действительно превышает точность точности z-буфера для opengl и удаленных объектов, которые сильно мерцают.Это место, где причудливый 3D-движок оставляет вас наедине со своей проблемой, и вам нужно истинное знание opengl :).Вероятно, я нашел правильный способ исправить проблему (эксперты OpenGL меня поправят, если я ошибаюсь), но мое решение упускает важный момент.Измененный рендерер выполняет двухпроходный рендеринг:
- в первом проходе должны отображаться удаленные объекты и фон, удалена ближняя плоскость, z-буфер доволен, местность выглядит хорошо, но ближние объекты отсечены.
- во втором проходе матрица проекции настраивается для объектов ближнего действия и должна отображать кабину.
Нерешенная проблема: во втором проходе все дальниеобъекты и фон невидимы, поэтому у меня есть кабина и черный фон за ней.Результат второго прохода полностью тратит впустую результат первого прохода.Ergo запланированного наложения не происходит.Вопрос: как заставить opengl игнорировать цвет фона во втором проходе, чтобы результаты обоих проходов создавали желаемое наложение?
PS Вот изображение статус-кво (ближние / дальние плоскости находятся в крайних положениях, чтобы сделать все детали видимыми, один проход без настроек проекции).
http://www.flickr.com/photos/43342833@N04/5995604542/sizes/l/in/photostream/
Очистка буфера происходит только один раз за цикл рендеринга и не включается между 2 проходами.Здесь код очистки:
JoglContext jctx = (JoglContext) ctx;
GLContext context = context(ctx);
GL gl = context.getGL();
// Mask of which buffers to clear, this always includes color & depth
int clearMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT;
gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT);
gl.glDepthMask(true);
gl.glClearColor(r, g, b, jctx.getAlphaClearValue());
gl.glClear(clearMask);
gl.glPopAttrib();
Подход, который вы описываете, также используется в 2 проходах: 1. проекция «на большие расстояния» и рельеф местности 2. «короткое расстояние» и кабина не пропускаются, но послевторой проход фон позади кабины черный.Может быть, функция glDepthRange поможет, надо проверить руководства.
Глубина zbuffer составляет 24 бита.