Как указано здесь , вам нужно применить перевод 0,375 в x и y, чтобы получить идеальное выравнивание по пикселям:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, width, 0, height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.375, 0.375, 0.0);
/* render all primitives at integer positions */
Алгоритм прост:
- Нарисуйте свою 3D-сцену, предположительно, с включенным тестированием глубины.
- Отключите тестирование глубины, чтобы элементы графического интерфейса рисовали поверх 3D.
- Используйте glPushMatrix для хранения текущего вида модели и матриц проекции (при условии, что вы хотите восстановить их, в противном случае просто превзойти их)
- Установите вид вашей модели и матрицы проекций, как описано в приведенном выше коде
- Нарисуй свой интерфейс
- Используйте glPushMatrix для восстановления ваших нажатых матриц (при условии, что вы их нажали)
Если сделать это так, положение камеры не будет иметь значения - фактически, когда камера перемещается, трехмерные детали будут работать как обычно, но наложение 2D остается на месте. Я ожидаю, что это поведение, которое вы хотите.