Я сделал класс 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
?
Короткий ответ: Нет, ты не можешь этого сделать.
Вы можете увидеть все дополнительные параметры для glTexImage2D()
в glPixelStore()
документация. Как видите, нет никаких параметров для добавления «шага» или «отступа» между пикселями. Существуют варианты добавления пробелов в начале или конце строк или между изображениями (3D), но не между пикселями.
Совет: Массив идентичных четырехмерных векторов с vtable для каждого — это запах дизайна. Это плохой дизайн. Ваш тип цвета, чтобы быть совместимым с C, должен быть стандартный тип макета. Обратите внимание, что, в частности, это означает, что вы не можете использовать виртуальные функции.
Если вам действительно нужен базовый тип с виртуальным деструктором, создайте тип оболочки.
Некоторые функции gl позволяют передавать stride
вместе с указателем данных, который сообщает gl, на сколько байтов следует увеличивать указатель, чтобы каждый раз переходить к следующему элементу данных. Вы могли бы пройти шаг sizeof(Color)
и если вы можете найти смещение в структуре структуры, чтобы добраться до поплавков … ну, это был бы единственный способ сделать это, что я вижу. Однако вам определенно нужно будет внести некоторые изменения. Чтобы форсировать соседний макет, вы должны сделать все поплавки, удерживаемые в float[4]
…
Несмотря на, glTexImage2D
на самом деле не имеет шага, так что это за окном.
Я думаю, что лучший вопрос, почему у вашей цветовой структуры есть базовый класс или виртуальный деструктор? Данные о цвете не являются ресурсом, так что это скорее всего нарушает правило три / правило пяти / правило нуля.
Возможно, вам лучше сделать простой POD-тип для цвета, а затем, если вы захотите сделать что-то необычное в деструкторе, создайте второй класс, содержащий цветной POD, а также базовый класс и т. Д.