Bagaimana cara memuat tekstur dengan SFML untuk OpenGL?

9

Saya melihat tutorial pemetaan tekstur NeHe . Itu terlihat terlalu rumit untuk hanya memuat tekstur.

Apakah ada cara untuk memuat tekstur di SFML dan kemudian menggunakannya di Open GL? Saya menggunakan SFML untuk windowing saya.

Darestium
sumber

Jawaban:

16

Selamat datang di OpenGL, di mana hal-hal cepat datang secara gratis dan hal-hal mudah menjadi sulit.

Jika Anda berpikir sampel itu panjang dan rumit, "hanya untuk memuat tekstur", maka Anda belum melihat apa-apa. Tunggu hingga Anda harus memuat tekstur DDS, memproses tekstur HDR, mendukung cubemaps, membuat tekstur, dll.

Memuat tekstur di OpenGL terdiri dari dua komponen:

  • Mendapatkan data dari format gambar Anda. Anda dapat memuat tekstur dari file atau membuatnya secara prosedural. Tidak masalah, selama Anda berakhir dengan sederetan informasi warna yang bagus.

  • Menempatkan data di kartu video. Data perlu beralih dari RAM sistem ke RAM video.

Bagian pertama harus mudah, karena SFML dilengkapi dengan pemuat gambar standar.

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

Selanjutnya, kita harus membuat objek tekstur OpenGL.

GLuint texture_handle;
glGenTextures(1, &texture_handle);

Ada sejumlah pilihan untuk mengikat tekstur. Ada tiga jenis utama: 1D, 2D dan 3D dan Anda memiliki dukungan untuk cubemaps (+ X, -X, + Y, -Y, + Z, -Z). Namun, dalam 99% kasus, Anda menginginkan tekstur 2D.

glBindTexture(GL_TEXTURE_2D, texture_handle);

Sekarang kita sampai pada bagian yang menarik. Mari unggah data kami ke kartu video.

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

Akhirnya, kita dapat mengatur sejumlah parameter tekstur. Pertanyaan-pertanyaan jawaban ini seperti: bagaimana jika kita menggunakan koordinat tekstur yang berada di luar rentang (0,0, 1,0)? Apakah kita membungkus ( GL_REPEAT) atau tidak ( GL_CLAMP)? Mereka juga dapat digunakan untuk menjelaskan kepada kartu video bahwa kami ingin menggunakan interpolasi linier pada tekstur kami.

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);

Dan sekarang Anda harus dapat mengikat tekstur Anda menggunakan glBindTexturedan menggunakannya untuk menggambar jerat bertekstur.

knight666
sumber
mmm, saya mencoba melakukannya dan yang saya dapatkan adalah kubus putih: pastebin.com/nVQFAMRJ
Darestium
Coba masukkan glEnable(GL_TEXTURE2D);fungsi init.
knight666
Luar biasa, bekerja! Terima kasih! BTW, apa fungsi itu lakukan? Aktifkan tekstur?
Darestium
Ya, ini mengaktifkan objek tekstur 2D, sehingga dapat menerima data tekstur. Anda hanya perlu mengaktifkannya sekali saat inisialisasi, tetapi sering dilupakan saat menyalin kode ke proyek baru. Termasuk saya sendiri. ;)
knight666
Penjelasan yang sangat bagus. Anda bisa menulis tutorial!
danijar
2

SFML 2.0+ membuatnya lebih mudah untuk memuat tekstur;

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
sumber