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.
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.
Jawaban:
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 glBindTexture
dan menggunakannya untuk menggambar jerat bertekstur.
glEnable(GL_TEXTURE2D);
fungsi init.
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