Изменить:, так что вы знаете: я еще не решил эту проблему, но в настоящее время я использую смещение 0.5px, похоже, это работает, но, как говорили другие, это не "правильное" решение. Таким образом, я ищу реальную сделку, решение для решения проблемы с алмазом не работает вообще.
Я считаю, что это ошибка в графической карте, возможно, но если так, то любой профессиональный программист должен иметь для этого пуленепробиваемые решения, верно?
Изменить: Теперь я купил новую карту nvidia (раньше была карта ATI), и я все еще испытываю эту проблему. Я также вижу ту же ошибку во многих играх. Так что я думаю, что это невозможно исправить чистым способом?
Вот изображение ошибки:
Как вы преодолеваете эту проблему? Предпочтительно, если это возможно, не шейдерное решение. Я попытался установить смещение для первой строки, когда я нарисовал 4 отдельных линии самостоятельно, вместо того, чтобы использовать режим каркаса, но это не получилось очень хорошо: если размер прямоугольника изменился, он иногда выглядел идеально прямоугольником, но иногда даже хуже, чем до моего исправления.
Вот как я рисую квад:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
glVertex2f(...);
glVertex2f(...);
glVertex2f(...);
glVertex2f(...);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
Да, я знаю, что могу использовать вершинные массивы или VBO, но здесь дело не в этом.
Я также пробовал GL_LINE_LOOP
, но он не исправил ошибку.
Изменить: Одно из решений, которое работает до сих пор: Идеальный 2D-чертеж Opengl от Lie Ryan:
Обратите внимание, что в пространстве координат OpenGL нет понятия целых чисел, все это поплавок, а "центр" пикселя OpenGL действительно находится на 0,5,0,5 вместо его верхнего левого угла. Поэтому, если вы хотите 1px широкая линия от 0,0 до 10,10 включительно, вам действительно нужно было нарисовать от 0,5,0,5 до 10,5,10,5.
Это будет особенно заметно, если вы включите сглаживание, если вы имеют сглаживание, и вы пытаетесь привлечь от 50,0 до 50 100, вы можете увидеть размытая 2px широкая линия, потому что линия упала между двумя пикселями.