В OpenGL можно нарисовать пиксель точно по координатам (5, 5)? - PullRequest
12 голосов
/ 27 мая 2011

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

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

Ответы [ 4 ]

19 голосов
/ 27 мая 2011

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

Предполагается, что окно имеет размер 640x480:

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

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

5 голосов
/ 06 января 2014

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

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

3 голосов
/ 27 мая 2011

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

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

3 голосов
/ 27 мая 2011

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

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

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

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

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

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

...