Линии неправильно рисуются в OpenGL с туманом?

Пожалуйста, взгляните на это: http://imgur.com/a/S8eOC

Эта проблема:

Сетка отрисовывается отлично, без тумана. Когда туман включен, вертикальные линии исчезают. Затем я поворачиваю немного влево, и все линии становятся невидимыми; если бы я повернулся еще больше, они бы полностью исчезли. Такое впечатление, что это зависит от угла обзора. Я думал, что это может быть проблема с освещением, но я выключил его, и результат был таким же.

Я также пробовал разные типы тумана, но результаты были такими же. Если я смотрю прямо вниз (угол 90º с плоскостью сетки), я могу четко видеть все линии сетки.

Что за щенок с таким поведением? Можно ли это исправить?

Код очень простой, но вот он на случай, если это важно:

главный():

glEnable(GL_FOG);
glHint(GL_FOG_HINT, GL_NICEST);

рендерсцена():

float fogColor[3] = {0.8f, 0.8f, 0.8f};
glFogfv(GL_FOG_COLOR, fogColor);
glFogi(GL_FOG_MODE, GL_EXP2);
glFogf(GL_FOG_DENSITY, 0.01f);

person rfgamaral    schedule 25.03.2011    source источник


Ответы (1)


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

Основной способ решить эту проблему — ввести больше вершин; создайте вершину для каждой точки пересечения и соедините каждую из них, чтобы создать сетку. Это приведет к гораздо большему количеству линий и вершин, но вы получите правильное поведение.

Ниже я расскажу более подробно, чтобы помочь объяснить концепцию алиасинга, которую вы, скорее всего, видите.

Помните, что любые значения, оцененные в вершинах (такие как цвета вершин, нормали, координаты текстуры), будут линейно интерполированы, чтобы покрыть треугольник/линию между ними. Представьте себе случай, когда мы хотим, чтобы пиксели в центре экрана были яркими, а пиксели по краям — темными. (Строго теоретический случай, но полезный для объяснения). Скажем, мы проводим линию от одного края, через середину и к другому краю. Скажем, мы делаем это только с двумя вершинами, по одной на каждом ребре. Затем мы вычисляем яркость обеих этих вершин как темную. Затем, чтобы нарисовать линию, OpenGL выполняет интерполяцию между темным и темным, чтобы определить цвет линии. Линия не может знать, что она должна быть яркой в ​​центре.

Таким образом, если вы добавите вершину в центр, теперь будет рассчитано, что центр яркий. Чем больше вершин вы добавляете, тем точнее становится яркость.

Удачи и получайте удовольствие. :)

person Nick Gebbie    schedule 26.03.2011