Как загрузить текстуры с помощью SFML для OpenGL?

Я смотрю учебник по отображению текстур NeHe . Это выглядит слишком сложно, просто загружая текстуру.

Есть ли способ загрузить текстуру в SFML, а затем использовать ее в Open GL? Я использую SFML для моего окна.

9 голосов | спросил Darestium 7 J000000Saturday12 2012, 04:25:59

2 ответа


16

Добро пожаловать в OpenGL, где быстрые вещи приходят бесплатно, и легкие вещи сделаны тяжелыми.

Если вы считаете, что образец был длинным и сложным, «просто для загрузки текстуры», вы ничего не видели. Подождите, пока вам не придется загружать текстуры DDS, обрабатывать текстуры HDR, поддерживать куб, преобразовывать текстуру и т. Д.

Загрузка текстуры в OpenGL состоит из двух компонентов:

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

  • Размещение данных на видеокарте. Данные должны поступать из ОЗУ системы в видеопамять.

Первая часть должна быть простой, потому что SFML поставляется со стандартным загрузчиком изображений.

sf::Image img_data;
if (!img_data.LoadFromFile("images/avatar.png"))
{
    LOG_ERROR("Could not load '%s'.", "images/avatar.png");
    return false;
}

Далее нам нужно создать объект текстуры OpenGL.

GLuint texture_handle;
glGenTextures(1, &texture_handle);

Существует несколько вариантов привязки текстуры. Существуют три основных типа: 1D, 2D и 3D, и у вас есть поддержка кубов (+ X, -X, + Y, -Y, + Z, -Z). Однако в 99% случаев вам понадобится 2D-текстура.

glBindTexture(GL_TEXTURE_2D, texture_handle);

Теперь мы перейдем к интересной части. Давайте загрузим наши данные на видеокарту.

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    img_data.GetWidth(), img_data.GetHeight(),
    0,
    GL_RGBA, GL_UNSIGNED_BYTE, img_data.GetPixelsPtr()
);

Наконец, мы можем установить несколько параметров текстуры. Они отвечают на такие вопросы, как: что, если мы используем координату текстуры, которая находится вне диапазона (0.0, 1.0)? Мы обертываем (GL_REPEAT) или ничего не делаем (GL_CLAMP)? Они также могут использоваться для объяснения видеокарты, что мы хотим использовать линейную интерполяцию на наших текстурах.

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_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

И теперь вы можете привязать свою текстуру с помощью glBindTexture и использовать ее для рисования текстурированных сеток.

ответил knight666 7 J000000Saturday12 2012, 10:38:46
2

SFML 2.0+ упрощает загрузку текстуры,

sf::Texture texLid;
std::string image2="images/top.jpg";
if (!texLid.loadFromFile(image2))
{
    std::cout << "Could not load" << image2;
    char c;
    std::cin>>c;
    return false;
}


glEnable(GL_TEXTURE_2D);//tell OpenGL to use textures when drawing

sf::Texture::bind(&texLid);//select this texture for OpenGL rendering
ответил Ken 15 MonEurope/Moscow2014-12-15T18:05:05+03:00Europe/Moscow12bEurope/MoscowMon, 15 Dec 2014 18:05:05 +0300 2014, 18:05:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132