Проблемы MipMapping в OpenGL

Я загружаю 3D-объекты (файлы obj, 3ds или collada) в свое приложение openGL. Окружение 3 довольно большое (несколько сотен метров по всей оси). Моя проблема в том, что меньшие 3D-объекты (т. е. порядка ~‹ 1-2 м) не проверяются на глубину должным образом. В зависимости от зума камеры я иногда могу видеть заднюю сторону объекта (для тестирования я использовал простой куб) или другие грани становятся видимыми/невидимыми/разорванными. Пожалуйста, смотрите прикрепленные изображения для лучшего объяснения. Я склонен полагать, что проблема связана с включенным мипмаппингом. Я хотел бы либо отключить мипмэппинг (может кто-нибудь предложить простой и быстрый способ сделать это), либо установить большее разрешение для объектов с мимаппингом. Или я совсем не на то дерево лаю?

alt textальтернативный текст альтернативный текст

Спасибо

Крис


person Sonoman    schedule 17.12.2010    source источник


Ответы (2)


Это результат недостаточной точности z-буфера, что является проблемой в играх с огромными мирами, но (относительно) маленькими объектами. Непосредственным решением было бы попробовать использовать 24-битный z-буфер вместо 16-битного. Другим способом решения этой проблемы может быть рендеринг игрового мира в два шага: сначала большие удаленные объекты, затем очистка z-буфера, а затем отрисовка более близких объектов.

Кстати, эта конкретная проблема называется z-fighting, вот отличный ресурс по этой проблеме: http://www.codermind.com/articles/Depth-buffer-tutorial.html

Вывод — последний абзац статьи выше:

истинная проблема заключается в том, что вы не можете рисовать как объекты, которые очень далеко, так и объекты, которые очень близки, с одними и теми же уравнениями буфера глубины. Если вы хотите рисовать очень далекие объекты, вам нужно пожертвовать своим ближним обзором, отодвинув его дальше. Чтобы избежать артефактов отсечения, вы можете сделать оболочку столкновения достаточно большой, чтобы ваша плоскость отсечения никогда не перехватывала существующий объект внутри усеченного конуса. Или вы можете заставить объект постепенно исчезать с прозрачностью, когда он приближается к вашей плоскости отсечения.

Если вы хотите сохранить близкие объекты и в то же время нарисовать горы (или планеты) вдали, то вы можете разрезать свой рендеринг на части. Сначала рисуем дальние объекты, затем очищаем буфер глубины и рендерим ближние объекты с другим z-буфером.

person Julio Gorgé    schedule 17.12.2010
comment
Спасибо за предложения вам обоим. Я попробую и надеюсь, что это исправит это. С другой стороны, проблема все еще очевидна, когда объект увеличен в 100 раз... - person Sonoman; 17.12.2010
comment
Я звоню gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);, но проблема все еще не устранена. Я немного озадачен, так как думал, что это приведет к очистке буфера глубины. Рендеринг этой модели является последним этапом процесса рендеринга, поэтому после этого этапа ничто другое не должно мешать Z-буферу. Любые идеи? - person Sonoman; 17.12.2010

Как и Хулио, я считаю, что это проблема точности глубины, а не что-то связанное с мип-маппингом. Тем не менее, я предлагаю вам начать с настройки ближней и дальней плоскости отсечения, прежде чем менять что-либо еще (вероятно, в любом случае вы уже используете 24-битный буфер глубины, так как это значение по умолчанию для большинства драйверов/карт). В частности, ближняя плоскость должна быть как можно дальше от вашей сцены. Ищите звонки glFrustum или gluPerspective.

person ltjax    schedule 17.12.2010