Как правильно отображать совпадающие полигоны в OpenGL (ES)

Я понимаю, что, установив функцию глубины в OpenGL ES, можно контролировать, как перекрывающиеся геометрии отображаются в 3D-сцене. Я использую gl.depthFunc(gl.LEQUAL) (webgl) в моем коде.

однако, когда два набора полигонов совпадают и имеют разный цвет, результирующая поверхность оказывается произвольным смешанным рисунком двух цветов (который изменяется по мере изменения местоположения камеры, следовательно, приводит к мерцанию). Взгляните на это изображение:

enter image description here

Как я могу это исправить? Я пробовал разные значения depthFunc, но ни один из них не решает эту проблему. Я бы хотел, чтобы совпадающие полигоны имели один цвет, неважно, какой из них.

4 ответов


Это называется z-fighting, и связано с двумя объектами, отображаемыми на одной и той же глубине, но ошибки округления (и точность буфера глубины) иногда появляются один перед другим. Одним из доступных вам решений является использование функции glPolygonOffset:

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPolygonOffset.xml

вы можете увидеть пример его использования в нижней части этой страница:

http://www.glprogramming.com/red/chapter06.html


то, что вы испытываете называется Z борьба и, к сожалению, нет окончательное решение против него. Происходит то, что из-за ограниченной точности буфера глубины возникают ошибки округления и либо один из примитивов "выигрывает" операцию тестирования глубины. Изменение функции глубины будет просто переключать цвета в боевом шаблоне, но не удалять его.

один из способов избавиться от борьбы с Z - это использование смещения многоугольника http://www.opengl.org/wiki/Basics_Of_Polygon_Offset

к сожалению, смещение полигона вводит свою долю проблем.


попробуйте изменить z-near, чтобы быть дальше от нуля в вашем вызове gluPerspective:

void gluPerspective(
    GLdouble    fovy,
    GLdouble    aspect,
    GLdouble    zNear,
    GLdouble    zFar);

С этого сайта: http://www.opengl.org/resources/faq/technical/depthbuffer.htm

буферизация глубины, похоже, работает, но полигоны, похоже, кровоточат через полигоны, которые находятся перед ними. Что происходит?

настроен zNear и zFar секущих плоскостей в сторону это серьезно ограничивает ваши точность буфера глубины. Как правило, это вызвано значением плоскости отсечения zNear, которое слишком близко к 0.0. Как плоскость отсечения zNear устанавливается все ближе к 0.0, эффективная точность буфера глубины резко снижается. Перемещение zFar обрезка плоскости дальше от глаза всегда оказывает негативное влияние на точность буфера глубины, но это не так драматично, как перемещение секущей плоскости zNear.


попробуйте возиться с glPolygonOffset(factor, units). на этой странице может помочь.