Как создать растровое изображение из целочисленного массива в C / OpenGL

1

Я пытаюсь переместить мой код с Java на C, и я столкнулся с проблемой при попытке найти функцию в C, которая может взять массив из int и создать растровое изображение для него для OpenGL. В Java я использовал

bitmap = Bitmap.createBitmap( {int array name} , w, h, Config.RGB_565);

Есть ли аналогичная функция, которую я могу использовать в C, или обходной путь, который я мог бы использовать?

Кроме того, если это имеет значение, я программирую для Android.

Спасибо!

Теги:
opengl-es

4 ответа

3
Лучший ответ

Я специально не знаком с Android, но если я правильно помню с помощью привязок OpenGL C, то нет структуры Bitmap. Вместо этого различные функции растрового изображения (т.е. glBindTexture()) просто принимают указатели GLuint (эквивалент C массива).

В Java все является классом, поэтому битмап имеет связанный с ним класс, но класс растрового изображения в основном представляет собой только оболочку (и некоторые функции) для массива int, который фактически содержит ваше изображение.

В OpenGL специально мы часто привязываем массив к glBindTexture, а затем другие функции текстуры берет имя, которое оно связывает для ссылки на правильное "состояние" для OpenGL.

С другой стороны, если вы пытаетесь закорачивать этот процесс, вы всегда можете использовать glTexImage2D

1

Я недавно изучил документацию для формата BMP, чтобы составить эту реализацию Python. Вы должны иметь возможность переносить это на C с небольшими проблемами.

0

Вот что вам нужно:

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , x_size, y_size, 0, GL_RGBA , GL_UNSIGNED_BYTE, (GLvoid *)your_data );

x_size и y_size должны иметь степень 2. для этого кода вам нужен массив x_sizey_size 4-байтных ints (или x_sizey_size * 4 байта). Для тестирования просто попробуйте:

unsigned char data[32*32*4];

for( int i=0; i< sizeof(data); ++i) data[i]=rand();
// Don't forget to #include <stdlib.h>

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , 32, 32, 0, GL_RGBA , GL_UNSIGNED_BYTE, (GLvoid *)data );

Другие возможные форматы: GL_BGRA (для разных порядков байтов), GL_RGB (если у вас нет альфы). Используйте glGenTextures/glBindTexture, чтобы запомнить настройку текстуры для дальнейшего использования.

  • 0
    Есть ли в любом случае я мог бы сделать это с целыми числами вместо байтов?
0

Функция, которую вы ищете, просто glTextImage2D(). Он загружает данные из массива в OpenGL. Вы указываете исходные и целевые форматы, которые у вас есть, и хотите, и все остальное.

Используйте вместе с glBindTexture() для создания сохраненного повторно используемого объекта текстуры, поэтому вам не нужно загружать данные текстуры перед использованием каждого кадра.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню