Я переглядаю навчальний посібник зі створення текстури NeHe . Це виглядає надмірно складним для просто завантаження текстури.
Чи є можливість завантажити текстуру в SFML і потім використовувати її у Open GL? Я використовую SFML для мого вікна.
Я переглядаю навчальний посібник зі створення текстури NeHe . Це виглядає надмірно складним для просто завантаження текстури.
Чи є можливість завантажити текстуру в SFML і потім використовувати її у Open GL? Я використовую SFML для мого вікна.
Відповіді:
Ласкаво просимо до 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% випадків вам потрібна двовимірна текстура.
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
використовуючи її для малювання текстурованих сіток.
glEnable(GL_TEXTURE2D);
функцію init.
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