Добрый день подскажите пожалуйста какие требования к bmp для загрузки в виде текстуры в OpenGL. Вопрос возник из-за того что некотоые текстуры bmp в OpenGLне подгружаются. подгружаю я таким образом. image = auxDIBImageLoad("carpet.bmp"); glGenTextures(1, &tex[1]); glBindTexture(GL_TEXTURE_2D, tex[1]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, image->sizeX, image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image->data);
а подробней..., некоторые подгружаются? ps:если не отображаются не значит что не подгружаются, глянь маны auxDIBImageLoad.
пардон за оффтоп (не хочется создавать тему ради этого новую): а каким образом можно заставить OGL в качестве текстур принимать графич. файлы и других форматов помимо BMP (хотя бы JPEG, TGA). а то BMP - это уже прошлый век.
varnie OpenGL не воспринимает ни каких форматов текстур, кроме одного своего RGBA. Так что если нужно JPEG, используй загрузчик, который загрузит в память RGBA. TGA довольно простой формат парситься очень легко, так как там максимум RLE сжатие, а со JPEG сложнее. Я предпочитаю OLE функции винды, довольно простой загрузчик получается.
сейчас попробовал применить процедурку для парсинга TGA файла. вроде бы все ок, но проблема такая же как и у топикстартера - текстура не отображается. в дебаге обнаружил, что после выполнения Код (Text): glGenTextures(1, &textureId); где textureId - это: Код (Text): GLuint textureId; textureId остается неинициализированным. т.е. если изначально textureId не был инициализирован, то в отладчике мы увидим BAADFOOD, или же, если был инициализирован нулем, то нуль и останется. это нормально или нет? если нет, то и у топикстартера походу такая же проблема. ps: щас проверил, wglCreateContext, wglMakeCurrent нормально отрабатывают в ходе инициализации OGL.
все проверил, теперь все работает. пардон за пост выше в случае, если получаю RGBA данные из TGA файла, то и glTexImage2D(), и gluBuild2DMipmaps() обе нормально работают, и в дальнейшем текстура отрисосывается нормально. в случае, если получаю RGBA данные из BMP файла, то если юзать glTexImage2D(), то текстура не выводится, а при gluBuild2DMipmaps() нормально выводится. вот это мне не ясно.
rmn Уже года три как не должны. Booster OpenGL воспринимает очень много форматов. Например GL_RGB4, GL_RGB5, GL_RGB8, GL_RGB10, GL_RGB12, GL_RGB16, GL_RGBA, и т.д. RTFMSDN. varnie Какие параметры фильтрации и какие параметры у неработающей glTexImage2D?
_DEN_, след. строчки: Код (Text): glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_NONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NONE); glTexImage2D(GL_TEXTURE_2D, 0, 3, _pBackground->_sizeX, _pBackground->_sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, _pBackground->_data);
_DEN_ Ну это само собой, я просто хотел сказать, что TGA, JPeg, и BMP сразу не загрузишь -). varnie Желательно посмотреть код, установки текстур. glTexParameter с какими параметрами используешь?
varnie Нет ты лучше приведи целиком, то есть с glBindTexture и glGenTextures. И почему в третьем параметре 3, а не GL_RGBA например?
Код (Text): //мой класс для получения RGB данных из графич. файла CImage *_pBackground; GLuint _textureId; _pBackground = new CImage(); if (!_pBackground || !_pBackground->loadFile("images/background.tga") ) return; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1,&_textureId); glBindTexture(GL_TEXTURE_2D, _textureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_NONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_NONE); //для BMP не пашет почему-то //здесь _pBackground->_data -- это PBYTE //_pBackground->_sizeX -- это unsigned int //_pBackground->_sizeY -- это unsigned int glTexImage2D(GL_TEXTURE_2D, 0, 3, _pBackground->_sizeX, _pBackground->_sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, _pBackground->_data); //а эта для всего пашет (TGA,BMP хотя бы) //gluBuild2DMipmaps(GL_TEXTURE_2D, 3, _pBackground->_sizeX, pBackground->_sizeY, GL_RGB, GL_UNSIGNED_BYTE, pBackground->_data); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
кстати, я вчера все это тестил на старом компе с процем пнем III 850 и со старой видюхой Radeon 9000 128 мб, а сегодня - уже на новом intel core 2 duo 2400MHz E6600, новой корсаровской памятью и, что самое главное, с новой видяхой -- GeForce 7900GS от Gigabyte на 256 mb. это я к чему - на новом железе у меня те оба варианта заработали. но все равно, был бы рад, если бы мне насчет моего кода выше пояснили - есть ли там баги итд. спасибо!
varnie glTexParameteri для GL_TEXTURE_WRAP_X никакого GL_NONE не принимает. Можно только GL_CLAMP или GL_REPEAT (если не считать расширений). Попробуй установить одну из них. Для чего ты юзаешь glPixelStorei(GL_UNPACK_ALIGNMENT, 1); ? Убери нафек. Странно вопщем. Псмотри что после фиксации врапа будет. Должно все работать. И посмотри, не заоверрайдены ли у тебя в дровах параметры фильтрации для текстур в опенжл. Скорее всего у тебя юзается мипмап фильтрация. Если моя догадка верна - подведи камеру вплотную к полику с текстурой. начиная с определенного расстояния ты ее (текстуру) увидешь.
_DEN_, да, насчет glTexParameteri ты прав. поправил. glPixelStorei(GL_UNPACK_ALIGNMENT,1); я юзаю, т.к. данные загруженной текстуры у меня хранятся не в float, а в unsigned char. по мануалу нужно юзать эту ф-цию в подобном случае. в общем, сейчас все пашет (правда, опять же, это на новой видяхе,т.к. теперь на старой проверить не могу, видяхи той нету). а каким образом мне можно узнать, , поясни пожалуйста?
varnie Покеж мануал. Некоторые параметра рендеринга можно заоверрайдить в дровах через какую-нить утилу, которая с дровами идет. Тоесть переопределить. Например можно жестко сказать видяхе что антиальясинг будет 8x, и все. Во всех приложениях будет 8x, а попытки его смены будут просто игнориться. То же касается и фильтрации.
(c) 3-D Computer Graphics by Samuel R.Buss т.к. у меня как раз таки данные и идут в unsigned char, т.е. НЕ float, то я и применяю эту команду согласно выдержке выше. разве не так?