Как правильно отображать совпадающие полигоны в OpenGL (ES) - PullRequest
9 голосов
/ 20 октября 2011

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

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

enter image description here

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

Ответы [ 4 ]

11 голосов
/ 20 октября 2011

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

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

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

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

3 голосов
/ 20 октября 2011

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

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

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

1 голос
/ 20 октября 2011

Попробуйте изменить свой z-ближний, чтобы он был дальше от нуля при вызове 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 плоскости отсечения.

0 голосов
/ 20 октября 2011

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

...