OpenGL с C ++: проблемы с таблицей при передаче массива классов в glTexImage2d

Я сделал класс Color с помощью float r, float g, float b, float alpha. Оно имеет базовый класс с виртуальным деструктором.

Я пытаюсь передать массив Color в функцию opengl glTexImage2Dс GL_RGBA организация типа float (который будет массивом {float r, float g, float b, float alpha}). Это требует Color содержать только 4 поплавка (размер 16 байт).

Тем не мение, sizeof(Color) показывает, что мой класс имеет размер 20 байт из-за базового класса Color иметь виртуальные таблицы, благодаря деструктору.

Как я могу сохранить свой vtable и при этом передать свой массив цветов glTexImage2D?

4

Решение

Короткий ответ: Нет, ты не можешь этого сделать.

Вы можете увидеть все дополнительные параметры для glTexImage2D() в glPixelStore() документация. Как видите, нет никаких параметров для добавления «шага» или «отступа» между пикселями. Существуют варианты добавления пробелов в начале или конце строк или между изображениями (3D), но не между пикселями.

Совет: Массив идентичных четырехмерных векторов с vtable для каждого — это запах дизайна. Это плохой дизайн. Ваш тип цвета, чтобы быть совместимым с C, должен быть стандартный тип макета. Обратите внимание, что, в частности, это означает, что вы не можете использовать виртуальные функции.

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

4

Другие решения

Некоторые функции gl позволяют передавать stride вместе с указателем данных, который сообщает gl, на сколько байтов следует увеличивать указатель, чтобы каждый раз переходить к следующему элементу данных. Вы могли бы пройти шаг sizeof(Color)и если вы можете найти смещение в структуре структуры, чтобы добраться до поплавков … ну, это был бы единственный способ сделать это, что я вижу. Однако вам определенно нужно будет внести некоторые изменения. Чтобы форсировать соседний макет, вы должны сделать все поплавки, удерживаемые в float[4]

Несмотря на, glTexImage2D на самом деле не имеет шага, так что это за окном.

Я думаю, что лучший вопрос, почему у вашей цветовой структуры есть базовый класс или виртуальный деструктор? Данные о цвете не являются ресурсом, так что это скорее всего нарушает правило три / правило пяти / правило нуля.

Возможно, вам лучше сделать простой POD-тип для цвета, а затем, если вы захотите сделать что-то необычное в деструкторе, создайте второй класс, содержащий цветной POD, а также базовый класс и т. Д.

4

По вопросам рекламы [email protected]