Как использовать glDrawPixels для рендеринга изображения в качестве фона

Вот в чем дело: я хочу загрузить изображение в качестве фона, заполненного целым окном просмотра. Этот фон всегда должен быть направлен на камеру, независимо от того, где находится камера. Сначала я естественно думаю использовать текстуру в качестве фона, мой код ниже:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0,1,0,1,0,1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

glBindTexture(GL_TEXTURE_2D, myimage.GetID());
glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(1, 0);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(0, 1); glVertex2f(0, 1);
glEnd();

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

Поверьте, myimage - это класс CIMAGE, который может загружать картинки в текстуры, он работает хорошо. Однако по неизвестной причине мое приложение не может загрузить текстуру в прямоугольник. (Я описал эту проблему здесь, нажмите). В результате я могу видеть только прямоугольную рамку вокруг моего окна просмотра.

Итак, я выясняю другое решение.

Я использую glDrawPixels вместо текстуры. Мой код ниже:

glRasterPos2i(0, 0);
glDrawPixels(myimage.GetWidth(), myimage.GetHeight(), (myimage.GetBPP() == 24)?GL_RGB:GL_RGBA, GL_UNSIGNED_BYTE, 
    myimage.GetData());

Картинка появилась! Однако картинка не всегда была обращена к моей камере. Это появляется только в определенном направлении. Вы знаете, как объект в сцене, но не фон всегда лицом к камере.

Кто-нибудь знает, как использовать glDrawPixels для реализации фона?

Кстати, я думаю, что этот фон не является объектом, помещенным в трехмерную сцену. Так что рекламные щиты не могут быть моим решением. Опять же, этот фон заполняет весь порт просмотра и всегда лицом к камере.

1 ответ

Решение

Одна из причин, по которой загрузка текстуры может не сработать, заключается в том, что она может не иметь степеней двух измерений. Попробуйте квадратную текстуру 256x256 (или подобное), чтобы увидеть, если это проблема. Посмотрите здесь для получения дополнительной информации о прямоугольных текстурах.

Возвращаясь к вашей второстепенной проблеме - правильный способ сделать это будет

  1. Настройте ортогональную проекцию / видовой экран, который заполняет весь экран.

    glViewport(0,0,nw,nh);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,1,0,1,0,1);
    glMatrixMode(GL_MODELVIEW);
    
  2. Отключить тестирование глубины

  3. Нарисуйте полноэкранный четырехугольник с текстурой / текстурным прямоугольником, который вы загрузили.

    glBegin(GL_QUADS);
    glVertex2f(0,0);
    glVertex2f(1,0);
    glVertex2f(1,1);
    glVertex2f(0,1);
    glEnd();
    
  4. Настройте свой обычный прогноз / просмотр модели и продолжайте.

Надеюсь это поможет!

Другие вопросы по тегам