Как @BrettHale упоминает, это проблема псевдонимов. Например,
![enter image description here](https://i.stack.imgur.com/oLsoC.png)
Без супер/мультисэмплинга треугольник покрывает только центральную часть нижнего правого пиксела, и только он получит цвет. Реальные пиксели имеют площадь и в идеальной ситуации получат часть цвета, равную площади, покрытой. Методы «сглаживания» уменьшают aliasing эффекты, вызванные не интегрированием цвета по пикселям.
![enter image description here](https://i.stack.imgur.com/N30xn.png)
Как это выглядит правильно, не будучи невероятно медленно, трудно. OpenGL предоставляет GL_POLYGON_SMOOTH
, который консервативно растеризует треугольники и рисует правильные проценты цвета для каждого пикселя с использованием смешивания. Это хорошо работает, пока у вас нет перекрывающихся треугольников, и вы попадаете на проблему сортировки прозрачности, где требуется order-independent transparency. Простое и более грубое решение состоит в том, чтобы визуализировать гораздо большую текстуру, а затем уменьшать размер. Это, по сути, то, что делает суперсэмплинг, за исключением того, что образцы могут быть «анизотропными» (нерегулярными), что дает более приятный результат. Методы мультисэмплирования являются адаптивными и немного более эффективными, например. суперсэмплы пикселей только на краях треугольника. Это довольно просто: set this up with OpenGL.
Однако, когда область треугольника приближается к нулю, область будет также и полностью исчезнет даже при сглаживании (хотя будет исчезать, а не становиться пиксельной). Хотя это и не является физически корректным, вы можете вместо трех минимального треугольника шириной в 1 пиксель, чтобы получить нужные строки, даже если это очень тонкий треугольник. Здесь может быть интересен ваш собственный conservative rasterization.
![enter image description here](https://i.stack.imgur.com/FBMM1.jpg)
Если у вас, скажем, (замкнутый) твердый или сетка из треугольников, вы должны были бы эти пиксели, чтобы избежать «трещины». Существуют определенные правила растеризации, которые определяют, какие пиксели «находятся», с соглашениями об отключении таймаута (полуоткрытый интервал), чтобы гарантировать, что треугольники, разделяющие край, не имеют избыточности. Вы можете улучшить внешний вид с помощью [мультисэмплинг] (https://www.opengl.org/wiki/Multisampling) или какой-либо другой метод сглаживания. –
Чтобы продолжить комментарий @BrettHale, если вы добавите четвертую вершину, чтобы четыре из них сформировали квадрат, состоящий из двух треугольников (34 были параллельными и имели такую же длину dx, что и 12), правила растрирования сделает второй треугольник заполнить пробелы, оставшиеся растеризацией треугольника 123. – datenwolf
@ datenwolf Я попытался нарисовать два треугольника вручную, используя 6 вершин (3 вершины для каждого треугольника), и результат почти такой же. Это исчезает почти на всех :) – JavaRunner