Подтвердить что ты не робот

В OpenGL можно ли рисовать пиксель точно в координатах (5, 5)?

По (5, 5) я имею в виду ровно пятую строку и пятую колонку.

Мне было очень сложно рисовать вещи с помощью экранных координат, все координаты в OpenGL относительны и обычно варьируются от -1.0 до 1.0. Почему это настолько серьезно, что не позволяют программистам использовать координаты экрана/координаты окна?

4b9b3361

Ответ 1

Несколько лет назад я немного поработал в 3D-программировании, и, хотя я далек от эксперта, я думаю, что вы игнорируете очень важное различие между классической растровой графикой DrawPixel(x, y) и типом графики, сделанной с помощью Direct3D и OpenGL.

В дни перед 3D компьютерная графика была в основном о растровых изображениях, то есть коллекции цветных точек. Эти точки имели соотношение 1:1 с пикселями на вашем мониторе.

Однако это имело многочисленные недостатки, в том числе сделать 3D очень сложным и требовать растровые изображения разных размеров для разных разрешений дисплея.

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

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

Подводя итог, вы не можете использовать координаты экрана/окна, потому что OpenGL основан на векторной графике.

Ответ 2

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

Предполагая окно размером 640x480:

// You can reverse the 0,480 arguments depending on you Y-axis 
// direction preference
glOrtho(0, 640, 0, 480, -1, 1);

Объекты буфера кадра и текстуры - это еще один способ, но вам нужно будет создать свои собственные процедуры растрирования (рисовать линию, круг, растровое изображение и т.д.). Для этого есть problaby libs.

Ответ 3

@dandan78 OpenGL не является средством визуализации векторной графики. Является Растеризатором. И более точно - это стандарт, описанный с помощью интерфейса языка C. Растеризатор отображает объекты, представленные в трехмерных скоординированных пространствах (автомобиль, дерево, сфера, дракон) в 2D скоординированные пространства (например, плоскость, окно приложения или ваш дисплей), эти 2d-координаты относятся к дискретной скоординированной плоскости. Метод встречной рендеринга растрирования - это трассировка лучей.

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

Ответ 4

Вы можете просто сменить "камеру", чтобы координаты 3D-координат соответствовали координатам экрана, установив матрицу просмотра модели на идентичность и проекцию на орфографическую проекцию (см. мой ответ на этот вопрос). Затем вы можете просто нарисовать одноточечный примитив в требуемых координатах экрана.

Вы также можете установить растровое положение glWindowPos (которое работает в координатах экрана, в отличие от glRasterPos), а затем просто используйте glDrawPixels для рисования изображения размером 1x1.