Преобразование в Cinder gl::Texture

Я пытаюсь создать объект gl::Texture, используя данные изображения в виде BYTE * с параметрами ниже.

FreeGLUT — я использую это для создания 2D-текстуры и привязки ее к квадроциклу.:

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textureWidth, textureHeight, 0, GL_BGRA_EXT,   GL_UNSIGNED_BYTE, data);
 glBindTexture(GL_TEXTURE_2D, 0); etc etc

Это прекрасно работает, однако я не могу найти способ создать объект gl::Texture в Cinder.

 text = gl::Texture(loadImage(loadAsset("text.jpg"))); // works with images files
 text = gl::Texture(data, GL_RGBA8, 640, 480); // BTYE * data This gives me a grey screen -

Это казалось наиболее вероятным, однако я понятия не имею, что делать с Format format = format();

Texture (const unsigned char *data, int dataFormat, int aWidth, int aHeight, Format format=Format()) 

Я действительно не понимаю, как это работает, и не могу найти лучшие учебники в Интернете. Спасибо.


person user1546650    schedule 05.10.2014    source источник


Ответы (1)


по-видимому, dataFormat является параметром формата для glTexImage2D и должен быть чем-то вроде GL_RGBA или GL_RGB (или GL_BGRA_EXT, как в приведенном вами примере)

Что вам нужно, так это «внутренний формат», который устанавливается через структуру Format. Итак, вы устанавливаете его так:

gl::Texture::Format fmt;
fmt.setInternalFormat(GL_RGBA8);
text = gl::Texture(data, GL_RGBA, 640, 480, fmt);

Формат GL_UNSIGNED_BYTE предустановлен в этом конструкторе обертки золы.

Иногда бывает проще просто посмотреть на код, чем пытаться найти 100% подходящую документацию.

person PeterT    schedule 05.10.2014
comment
Большое спасибо. Ваш ответ имеет смысл, но когда я вызываю gl::draw(text, getWindowBounds()); Я все еще получаю серый фон. Это работает при использовании gl::Texture(loadImage из файла. Есть ли что-то еще, что мне нужно сделать по-другому? В freeGLUT я накладывал текстуру на четырехугольник, но я понимаю, что текстура должна нормально работать с gl::draw моя текстура, загруженная из файла, отображается правильно). - person user1546650; 06.10.2014
comment
@user1546650 user1546650 Я думаю, очень важно убедиться, что data действительно указывает на данные изображения, используйте отладчик и посмотрите, имеют ли смысл значения. - person PeterT; 06.10.2014
comment
Спасибо, похоже, что оставшаяся проблема - это ошибка в моем основном коде (я пытался проверить отладчик, но не совсем уверен, что искал: P). - person user1546650; 06.10.2014
comment
@user1546650 user1546650, если вы не знаете, как проверять указанные данные в своем отладчике, просто сделайте это в своем коде для целей отладки (например, отладки printf). Например, сделать std::cout << (int)data[100] << (int)data[101] << (int)data[102]; для нескольких значений, которые имеют смысл. И, конечно же, проверка самого data (указывает ли он на 0 или какое-то другое мусорное место) - person PeterT; 06.10.2014