Как предотвратить зазубренные края вдоль поверхностей моей 3d-модели? - PullRequest
2 голосов
/ 10 апреля 2010

Допустим, я реализовал в openGL грубую программу просмотра моделей с затенением, которая отображает серию блоков, так что у меня есть нечто, похожее на это.

http://i.imgur.com/TsF7K.jpg

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

http://i.imgur.com/Bgl9o.jpg

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

  1. Каковы наилучшие значения коэффициента и единицы измерения для glPolygonOffset, чтобы предотвратить это?

  2. Осуществит ли сглаживание проблему? компромисс в производительности тривиален / значим?

  3. возможно, это проблема с затенением? я должен попробовать решение по этой линии мысли?

Ответы [ 2 ]

3 голосов
/ 11 апреля 2010

Это не похоже на Z-бой для меня ..

Если вы рисуете плоские затененные объекты, а затем несколько GL_LINES поверх них, эти линии будут создавать этот эффект, потому что они не сглажены.

Почему бы просто не наложить текстуру сетки на ваши объекты? Таким образом, вы можете воспользоваться фильтрацией текстур OpenGL. Вы можете попробовать:

  • Включить фильтрацию MIN_ и MAG_ для этой текстуры.
  • Создайте текстуру с помощью mipmaps, используя gluBuild2DMipmaps. (см. Создание Mipmaps )
  • Включить анизотропную фильтрацию? (см. эту страницу )
1 голос
/ 10 апреля 2010

Скорее всего, вы получаете z-бой под крутыми углами (то есть, когда все точки имеют очень похожие значения z), потому что
1) У вас слишком низкое разрешение z-буфера, т. Е. Вы установили 16-разрядный буфер z - попробуйте изменить разрешение на 32-разрядное
2) Ваша модель очень маленькая, т.е. все ваши точки расположены слишком близко друг к другу. Вы можете попробовать увеличить модель.

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

Вот статья gamedev , в которой более подробно обсуждается проблема

Обратите внимание, что сглаживание и изменение шейдера вряд ли помогут здесь (если вы не сделали какой-нибудь необычный пиксельный шейдер для модуляции значений z, но это кажется мне излишним, хотя я не эксперт по пиксельным / фрагментным шейдерам так что это может быть выполнимо)

...