Линии не правильно нарисованы в OpenGL с туманом? - PullRequest
1 голос
/ 26 марта 2011

Пожалуйста, посмотрите на это: http://imgur.com/a/S8eOC

Проблема:

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

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

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

Код очень простой, но здесь он важен:

main ():

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

renderScene ():

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);

1 Ответ

3 голосов
/ 26 марта 2011

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

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

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

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

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

Удачи и веселья. :)

...