Основен профил на 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, вие давате единица quad като вход (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> Въпреки това, той все още се поддържа в контекст на профил за съвместимост.

Вижте спецификация на основния профил на OpenGL 4.6 API - E.2.1 Отхвърлени, но все още поддържани функции:

Следните функции са отхвърлени, но все още присъстват в основния профил. Те могат да бъдат премахнати от бъдеща версия на OpenGL и да бъдат премахнати в контекст, съвместим с напред, прилагащ основния профил.

  • Широки линии – Стойности на LineWidth, по-големи от 1,0, ще генерират грешка INVALID_VALUE

За контекст на основен профил възможните решения са представени в отговорите на:
Ширина на линията на OpenGL
GLSL Geometry шейдър за замяна на glLineWidth
Чертане на линия с променлива ширина в openGL (без glLineWidth)
OpenGL: дебели и гладки/непрекъснати линии < em>в 3D

person Rabbid76    schedule 22.01.2020