Ограничения OpenGL Z-Biasing (Polygon Offset) - PullRequest
2 голосов
/ 23 марта 2011

У меня есть два копланарных полигона.

Я пытался сделать.

glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0,1);

и ожидается, что одно будет явно «поверх» другого.

Это имеет место до расстояния около 70-75 единиц (с ближней плоскостью отсечения 1 и дальней плоскостью отсечения 10000). Затем область около 50 юнитов, где идет z-борьба, а затем, кажется, появляется альтернативный многоугольник.

Добавляется ли смещение полигона до или после обычных z-вычислений? Если бы это было после, я бы подумал, что это «просто сработало бы» на всех расстояниях.

Я использую неправильные значения? Я неправильно понимаю ожидаемые результаты? Или это должно работать, и я, вероятно, делаю что-то не так в другом месте?

Я боялся пробовать большие значения, потому что на сцене есть другие объекты, и, если их было достаточно много, они могли бы «прыгнуть» перед этим объектом и на большие расстояния.

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Я не использовал glPolygonOffset, но я просто прочитал об этом в официальном FAQ - обязательно к прочтению, если вы еще этого не видели. Существует также справочная страница .

Согласно этой ссылке, смещение вычисляется после нормальных расчетов Z, но применяется до теста глубины и перед записью в буфер глубины.

Я могу вспомнить две проблемы. Во-первых, FAQ рекомендует использовать glPolygonOffset(1,1), а не (0,1). Первый «факторный» аргумент умножается на наклон многоугольника и добавляется к смещению. Это, по-видимому, важно для "ребристых" полигонов. Если многоугольник направлен на камеру, это не имеет значения, но если он находится под углом, величина, которую вам нужно продвинуть вперед, увеличивается с углом.

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

В-третьих, я подозревал, что ваш буфер глубины слишком велик (учитывая, что буферы глубины имеют гиперболический масштаб, который благоприятствует объектам, расположенным близко к камере). Я не уверен в этом, учитывая, что glPolygonOffset должен работать со значениями глубины, а не со значениями Z (поэтому масштаб буфера глубины не должен быть здесь фактором). Возможно, вы захотите попробовать его с более коротким буфером глубины (возможно, 1000) и посмотреть, имеет ли это значение.

0 голосов
/ 23 марта 2011

Вы можете попробовать установить одно положительное смещение многоугольника на одно отрицательное смещение, держу пари, что это сработает.

glPolygonOffset (0,1) и glPolygonOffset (0, -1)

...