Могу ли я представить прямоугольник как XYWH RGB? - PullRequest
1 голос
/ 29 апреля 2020

Я изучаю OpenGL, и я экспериментировал с созданием виджетов для GUI. Отображение моно chrome коробки как (pos, color)[4] кажется мне немного расточительным. Есть ли способ упаковать это до (x, y, w, h, color)?

Я не собираюсь рисовать достаточно ректов, чтобы это имело большое значение, но мне любопытно.

Примечание: Для удобства я представляю каждую вершину / объект с помощью кортежа.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Хорошо, так что после некоторого эксперимента с подсказкой Spektre, я думаю, у меня есть решение.

Я решил представить форму в виде:

struct Shape {
  enum Kind : byte {
    LineRect,
    FillRect,
    ...
  }

  float2 position, extent;

  uint color;

  Kind kind;
}

Вершина шейдер получает эту структуру и передает всю вещь вместе с проекционной матрицей геометрическому шейдеру для генерации вершин. Геометрический шейдер включает kind и выдает вершины для формы, умножая каждую вершину на матрицу проекции.

Этот формат требует 21 байт (float + float + float + float + uint + byte) для представления прямых, окружностей, равнобедренных треугольников и, возможно, эллипсов. У меня есть основания полагать, что текстурированные канавы также возможны, когда color делится на ushort[2] для УФ-координат.

0 голосов
/ 29 апреля 2020

Ну, вы можете каким-то образом абстрагировать код для некоторого класса, который использует эти параметры, что-то вроде SDL2. Нет класса OpenGL, который мог бы помочь вам с этими вопросами. Что-то вроде:

struct Vertex {
    glm::vec3 position;
    glm::vec3 color;
};
class Model {
private:
    std::vector<Vertex> mVertices;
public:
    Model(/* Pass Vertices or Load Model through OBJ */);
};

Это то, что я использовал, и извините, вместо того, чтобы передавать вершины, передают unsigned int width, unsigned int height, unsigned int xpos, unsigned int ypos и передают их в матрицу преобразования. Надеюсь, что поможет!

...