Основной профиль OpenGL 3.2 glLineWidth

Я настраиваю контекст OpenGL 3.2 Core в Mac OS X. Я хочу иметь возможность рисовать на экране несколько толстых черных лайков. В предыдущей версии OpenGL я мог просто установить

glLineWidth(10.0f);

и я получу линию шириной 10 пикселей. Однако, когда я проверяю диапазоны ширины линии в 3.2 Core

GLint range[2];
glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE, range);
glGetIntegerv(GL_SMOOTH_LINE_WIDTH_RANGE, range);

Я получаю значения 1 для линий с псевдонимами и 0-1 для гладких линий. Как я могу сделать линию шириной 10,0 пикселей в пространстве экрана? Есть ли простой способ нарисовать это, кроме как сделать каждый сегмент линии прямоугольником?


person user1139069    schedule 09.01.2012    source источник


Ответы (3)


При использовании основного профиля OpenGL 3.2 вызов glLineWidth со значением больше 1,0 приводит к ошибке INVALID_VALUE (вызовите glGetError, чтобы доказать это).

Наверняка можно получить желаемый результат, определив необходимый для отрисовки линии квадрат.

Я думаю, вы должны иметь возможность генерировать четырехугольники из точек линии: эй, большая линия — это четырехугольник! Возможно, вы могли бы использовать такие методы, как это, чтобы получить желаемый результат.

Суть в следующем: вместо того, чтобы полагаться на LineWidth, вы даете в качестве входных данных единичный квадрат (4 вершины, используя треугольную полосу), затем преобразуете входящие вершины внутри шейдера, передавая ему соответствующие юниформы.

Возможно, другим подходом будет рендеринг с использованием шейдера геометрии: создание четырехугольника из точки. Однако я не уверен в этом. Я не знаю, будет ли геометрический шейдер (конечно, только если это возможно) лучшим подходом: стоимость рисования линейной полосы с использованием одного четырехугольника будет равной настройке шейдера для каждой линии, составляющей полосу.

person Luca    schedule 09.01.2012
comment
Похоже, что лучший/единственный способ сделать это — отрисовать полный геометрический эфир через исходную геометрию или геометрический шейдер. - person user1139069; 11.01.2012

Это может зависеть от типа проекции, которую вы настроили. Вы используете орфографическую или перспективную матрицу проекции?

Я думаю, что если вы не используете орфографическую проекцию, окончательная растеризация примитива будет зависеть от расстояния объекта (матрицы модели) от камеры (матрицы вида).

Ваше здоровье

person Maurizio Benedetti    schedule 09.01.2012
comment
Я использую орфографическую проекцию. - person user1139069; 09.01.2012

Ширина строки > 1,0 устарела и больше не поддерживается в основном профиле Контекст OpenGL.< br> Тем не менее, он по-прежнему поддерживается в контексте профиля совместимости.

См. Спецификацию основного профиля API OpenGL 4.6 — E.2.1 Устаревшие, но все еще поддерживаемые функции:

Следующие функции устарели, но все еще присутствуют в основном профиле. Они могут быть удалены из будущей версии OpenGL и удалены в контексте совместимости с более ранними версиями, реализующем базовый профиль.

  • Широкие линии — значения LineWidth больше 1,0 приведут к ошибке INVALID_VALUE.

Для контекста основного профиля возможные решения представлены в ответах на:
Ширина линии OpenGL
Геометрический шейдер GLSL для замены glLineWidth
Рисование линии переменной ширины в openGL (без glLineWidth)
OpenGL: толстые и гладкие/неразрывные линии < em>в 3D

person Rabbid76    schedule 22.01.2020