#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