Как рассчитать толщину как фиксированную ширину, как это делает opengl?

#c #opengl #line

#c #opengl #строка

Вопрос:

Как рассчитать толщину как фиксированную ширину, как это делает OpenGL?

Рисование линий с использованием OpenGL GL_LINES не зависит от проекции (если я могу назвать это так). Я хотел бы добиться того же эффекта с GL_TRIANGLE_FAN помощью .

У меня есть следующая настройка вершин в псевдокоде

 void DrawLine(const std::pair<float, float>amp; a, const std::pair<float, float>amp; b, float thickness)
{
    const auto [ax, ay] = a;
    const auto [bx, by] = b;
    const auto [dx, dy] = std::make_pair(bx - ax, by - ay);

    auto [normal1x, normal1y] = Normalize(std::make_pair(-dy, dx));
    auto [normal2x, normal2y] = Normalize(std::make_pair(dy, -dx));

    normal1x *= thickness; normal1y *= thickness;
    normal2x *= thickness; normal2y *= thickness;

    vertices.emplace_back({ ax   normal1x, ay   normal1y });
    vertices.emplace_back({ ax   normal2x, ay   normal2y });
    vertices.emplace_back({ bx   normal2x, by   normal2y });
    vertices.emplace_back({ bx   normal1x, by   normal1y });

    glNamedBufferData(vertexBufferObject, sizeof(float) * 2 * vertices.size(), vertices.data(), GL_STREAM_DRAW);
    glDrawArrays(GL_TRIANGLE_FAN, 0, vertices.size());
}
  

он рисует красивую линию, но она не имеет фиксированной ширины.

Как я могу рассчитать фиксированную ширину для строки?

Комментарии:

1. на стороне -примечание: почему вы заключаете { ax normal1x, ay normal1y } в фигурные скобки? вы можете просто сделать emplace_back(ax normal1x, ay normal1y) (предполагая, что вершины — это vector<pair>

2. TBH, я не знаю. В любом случае, в исходном коде это делается по-другому.

3. Я предлагаю опубликовать скриншот вашего текущего вывода. Я «прогнал код» в своей голове, и он показался мне прекрасным, так что, возможно, просмотр фактического результата поможет.

4. @nmr, потому что он работает нормально. Но когда вы используете проекцию, скажем, перспективу, а ваша сцена находится далеко-далеко, линия будет невидимой. И когда вы используете GL_LINES , не имеет значения, как далеко находится камера, потому что OpenGL использует фиксированную ширину для линий. Я хочу иметь ту же функциональность с фиксированной шириной в моем коде. Мне пришлось бы записать видео, чтобы лучше интерпретировать мои слова.

5. О, ну, это не ответ на ваш вопрос, но FWIW вы выполняете возмущение мирового пространства вершин, и вы хотите выполнять возмущение пространства экрана на основе проецируемых (в пространство экрана) вершин. Легко сделать в вершинном шейдере, не уверен, есть ли он у вас, учитывая, что вы используете немедленный режим OpenGL