2016-10-10 2 views
8

Проблема, что у меня есть, есть некоторые пиксели в моей визуализированной сцене , которые, кажется, отсутствуют/невидимы и поэтому имеют тот же цвет, что и мой чистый цвет . Интересно, что это происходит только в случае отключения MSAA.Где пробелы пикселей появляются в OpenGL?

Blue pixel are the problematic ones

Моя первая мысль была, что это может иметь что-то делать с тем фактом, что все треугольники накладываются друг на друга и как-то искажено матрицей проекции, но эти артефакты только кажется, происходят на линиях, а не кромками ,

Wireframe of the scene above (leaking pixels are white)

я прочитал о только применяя шкалу 1.00001 ко всему, другой вопрос, но это кажется дешевой хак мне, что может вызвать другие проблемы. Хотя эти артефакты, по-видимому, уменьшаются при использовании аппаратной мультисэмплинг, я хочу знать, есть ли другой способ решить эту проблему.

Edit:

Способ решить эту проблему Nicol Bolas:

OpenGL (и все другие аппаратные Средства прорисовки) только гарантирует беспрерывное визуализацию края между двумя треугольниками, если края ровно совпадение. И это означает, что вы не можете просто иметь один треугольник рядом с краем другого. Два треугольника должны иметь одинаковые вершины на общем краю между ними.

Итак, если у вас длинный треугольник рядом с коротким треугольником, то вам нужно разделить длинный треугольник на несколько треугольников, чтобы общая часть края была должным образом разделена между двумя треугольниками.

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

+0

16-битные поплавки - должны их ненавидеть – dtech

+0

Будучи низкоточными машинами, вы действительно не хотите, чтобы ваша геометрия была урезана до края (как вам хотелось бы на практике или чертежу САПР), потому что ошибки аппроксимации в конечном итоге проявляются как графические артефакты. Как правило, у вас будет один самолет для пола, и он слегка войдет в стены и так далее. – dtech

+0

У вас есть T-соединения. Это точный дубликат http://stackoverflow.com/questions/18523231/opengl-shimmering-pixels-artifact - публикация его, потому что кто-то снова открыл (почему?) – ybungalobill

ответ

7

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

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

Поскольку вы, кажется, строите мир из кубиков, это должно быть довольно легко для вас.

Другое, что вам нужно сделать, это убедиться, что две общие вершины между двумя треугольниками: двоичные идентичные. Результат gl_Position из вершинного шейдера должен быть того же самого значения. Поэтому, если вы вычисляете положение вершин куба в VS, вам нужно сделать это таким образом, чтобы гарантировать двоичные идентичные результаты.

Но в моем случае я хочу сохранить жадную сетку из-за аспектов производительности.

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

+0

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

+0

@ DieEidechse12: Отредактировано. –

+0

спасибо. у вас есть идея, как современные игровые движки решают эту проблему? – obsilp

1

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

-2

Это также известно как Z-борьба.

https://en.wikipedia.org/wiki/Z-fighting

Это происходит, когда 2 вершины/многоугольники занимают одно пространство на том же расстоянии от места просмотра. Когда GPU разрешает это, ошибка с плавающей запятой может ударить, и она может запутаться в том, какая вершина занимает президентство (какой из них вы решаете!).Этого можно преодолеть, используя лучшую графическую карту (карты САПР могут решить эти проблемы лучше) и применить немного больше информации о том, как рисовать полисы (возможно, нужно проверить глубину полисов, чтобы вы могли убедиться, какой поли перед чем) так как это может помочь карте правильно нарисовать ее. Точность аппаратного обеспечения в конечном итоге будет ограничивать его и производить эти артефакты.

2

Это называется «сшивание». Растеризатор точно не соответствует треугольникам, а некоторые пиксели отсутствуют. Другие объяснили, как настроить треугольники, поэтому OpenGL знает, что они разделяют и режут. Однако, поскольку ваша логика построения модели становится все сложнее, иногда сложно сшивать. Обходной путь состоит в том, чтобы очистить до черного или темно-серого цвета, а швы тогда почти невидимы.

Смежные вопросы