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