Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Загрузка изображения без расстягивания


Автор: ecspertiza 17.9.2009, 14:50
Начну с того что в OpenGL валенок по сравнению со мной доцент химико-технических наук, поэтому поправте если буду пороть чего нибудь не то, суть такова нужно загрузить на сцену изображение, я пока пользовался только так

загрузка изображения

Код

        QPixmap pxm;
        pxm.load(QCoreApplication::applicationDirPath()+"/image/"+QString::number(i)+".jpg");

        GLuint texture = bindTexture(pxm,GL_TEXTURE_2D,GL_RGBA);


зате собственно рисование

Код

            glTranslatef(0.0,0.0,0.0);
            glBindTexture(GL_TEXTURE_2D, texture);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
            glBegin(GL_QUADS);
                glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f,  0.0f);    // Низ лево
                glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f,  0.0f);    // Низ право
                glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  -1.0f,  0.0f);    // Верх право
                glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  0.0f);    // Верх лево
            glEnd();


вобщем самое простое, естественно оно расстягивается по всей поверхности, а как его загрузить так что бы оно не дефформировалось(не расстягивалось) ?

Автор: Solomon 18.9.2009, 10:38
я ничего не понял если честно  smile 

Что тебе требуется? нарисовать текстуру не на всем QUADS  а только на части его? или что значит загрузить что бы оно не дефформировалось????

Автор: ecspertiza 18.9.2009, 11:37
Ну да немного странно объяснил.


Цитата(Solomon @  18.9.2009,  10:38 Найти цитируемый пост)
нарисовать текстуру не на всем QUADS  а только на части его


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

Автор: Solomon 21.9.2009, 14:19
ecspertiza, ну ты же когда квад строишь, то задаешь координаты вершин... посмотри внимательно в свой код... 
Т.е. при рисовании вершин квада просто отталкивайся от размеров текстуры...

попробуй сам это реализовать, если не получиться пиши... помогу

Автор: ecspertiza 24.9.2009, 12:17
Видимо помощь все таки потребуется, я пока накидал вот так вот

Код

if (width > height)
        {
                    glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0);
                    glTexCoord2f(1.0f, 0.0f);glVertex3f(2,0,0.0);
                    glTexCoord2f(1.0f, 1.0f);glVertex3f(2,2,0.0);
                    glTexCoord2f(0.0f, 1.0f);glVertex3f(0,2,0.0);
        }else
        {
            glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0);
            glTexCoord2f(1.0f, 0.0f);glVertex3f(1.5,0,0.0);
            glTexCoord2f(1.0f, 1.0f);glVertex3f(1.5,2,0.0);
            glTexCoord2f(0.0f, 1.0f);glVertex3f(0,2,0.0);
        }


width и height это ширина и высота изображения в соответствии с ними я изменяю размер поверхности, ну чую что это неверно, ибо здесь еще нужно как то учитывать пропорции изображения и видимо разрешение экрана.

Вот пока не знаю как.  

Автор: Solomon 25.9.2009, 14:06
ecspertiza, сделай следующую проекцию 

Код

glMatrixMode(GL_PROJECTION);
 glLoadIdentity();             
 glOrtho(0.0f, screen_width, screen_height, 0.0f, -1.0f, 1.0f); 
 glMatrixMode(GL_MODELVIEW);    


далее при рисовании ты уже будешь отталкиваться от размеров... примерно так... а там поглядишь.. могу ошибиться 
Код

 glTexCoord2f(0.0f, 0.0f);glVertex3f(posX,              posY,               0.0f);
 glTexCoord2f(1.0f, 0.0f);glVertex3f(posX + imageWidth, posY,               0.0f);
glTexCoord2f(1.0f, 1.0f);glVertex3f (posX + imageWidth, posY + imageHeight, 0.0f);
glTexCoord2f(0.0f, 1.0f);glVertex3f(posX,               posY + imageHeight, 0.0f);

где posX, posY  соответственно позиция картинки на экране
imageWidth, imageHeight - размеры картинки в пикселах

так же почитай этот http://pmg.org.ru/nehe/nehe21.htm

Автор: Rickert 28.9.2009, 10:30
ecspertiza, а вы не в курсе, что все текстуры должны быть ТОЛЬКО квадратными, а их размеры кратны 2? Если вам нужна не квадратная текстура, то тут сложнее будет.
Допустим у вас изображение 68х80 (ш/в). Начинается процесс загрузки; смотрим самую большую цифру в нашем размере - 80. Ближайшее число, кратное двойке - это 128 (в 64 - картинка вся не влезет); отводим память под изображение размером 128х128; в область 68х80 копируем наше изображение, остальная часть картинки - пусть будет забита нулями(т.е. будет чёрной). Текстура готова, можем сказать opengl чтобы он её загрузил в видео память; теперь дело за малым - надо  правильно наложить текстуру на наш объект; за это ответственны UV координаты; теперь у вас минимум будет, как и раньше - 0 и 0, а максимум - 0.68 (U) и 0.8 (V).

Автор: Solomon 28.9.2009, 11:24
Цитата(Rickert @  28.9.2009,  09:30 Найти цитируемый пост)
ecspertiza, а вы не в курсе, что все текстуры должны быть ТОЛЬКО квадратными, а их размеры кратны 2?


Ну я бы не говорил это как аксиому... это скорее рекомендация...очень хорошая рекомендация

Автор: Rickert 28.9.2009, 12:02
Solomon, не понял. С каких пор это не аксиома? Нет, понятное дело что мипмап карты можно построить из не квадратных изображений, но они будут искажены.

Автор: Solomon 28.9.2009, 13:09
Rickert, Ну тут все зависит от контекста использования... в 2Д, к примеру, очень даже активно используються не квадратные текстуры. А судя из поставленного вопроса обсуждался именно вывод 2Д картинки...

 Но опять же я не буду говорить что я категорически не соглашаюсь с твоей точкой зрения...

p.s. ладно не будем разводить флейм и путать человека...

Автор: ecspertiza 30.9.2009, 16:36
Вот что у меня получилось навоять(в аттаче), конечно с пропорциями изображений я немного накосячил, ещё вопрос не знаю можно ли сюда тоже отписать, я попробовал реализовать отражение и чё то всё совсем плохо стало, если что торкните носом где я туплю.

Для того что бы пример заработал нужно в папке с exe-шником создать папку image и закинуть туда несколько картинок с именами от 1 до 11 включительно.

Автор: just_geek 30.9.2009, 16:55
Если сильно приперло, можешь воспользоватся расширениями, которые позволяют работать NPOT текстурами. Естественно у них есть ограничения, в отличии от POT текстур.
  • GL_NV_texture_rectangle
  • GL_ARB_texture_rectangle
  • GL_EXT_texture_rectangle
Выбирай какой больше нравится smile

p.s. на Intel'ax с ними может быть проблема.Л

Автор: Rickert 1.10.2009, 06:55
И не только на интелах. Например GL_NV_texture_rectangle является расширением от NVIDIA, следоватльено на других видяхах могут быть проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)