2016-01-08 8 views
4

Я сделал класс Color с float r, float g, float b, float alpha. Он имеет базовый класс с виртуальным деструктором.OpenGL с C++: проблемы с vtable при передаче класса массива в glTexImage2d

Я пытаюсь передать массив Color функции OpenGL glTexImage2D, с GL_RGBA организации типа поплавка (который был бы массив {флоат г, поплавок г, поплавок б, поплавок альфа}). Для этого требуется, чтобы Color содержал только 4 поплавки (размером 16 байт).

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

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

+0

В переносном стандартном режиме? Вы абсолютно не можете. Будет ли не переносной, нестандартный взлом? (не то, что я знаю об этом, но все же вам нужно сообщить сообществу :) –

+3

Нельзя хранить изображения в виде массива «Цвет». В этом случае vtable - огромная доля памяти. И вы, вероятно, не должны иметь разные пиксельные форматы в одном изображении. Но если вы хотите передать его в 'glTexImage2D', сначала конвертируйте его в простой массив в отдельный буфер памяти. – HolyBlackCat

+0

Почему вы все равно используете виртуальный тип? Для чего нужен виртуальный деструктор? Имеет ли он виртуальные функции? Если да, то почему? –

ответ

4

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

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

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

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

+0

Стандартный тип макета - отличная концепция, я буду использовать его. Благодарю. –

4

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

Независимо от того, glTexImage2D фактически не имеет шага, поэтому оно вне из окна.

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

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

+0

Спасибо за ваш ответ. Истина заключается в том, что я исправил проблему перед тем, как спросить, потому что виртуальный деструктор действительно бессмыслен. Базовый класс фактически содержит первые три элемента float. Цвет действительно просто добавляет несколько операций, альфа и доступ через R(), G() и B(). –