OpenGL için SFML ile dokuları nasıl yüklerim?


Yanıtlar:


16

Hızlı şeylerin ücretsiz olduğu ve kolay şeylerin zorlaştığı OpenGL'ye hoş geldiniz.

Eğer numunenin uzun ve karmaşık olduğunu düşünüyorsanız, "sadece bir doku yüklemek için", o zaman henüz hiçbir şey görmediniz. DDS dokularını yüklemek, HDR dokularını işlemek, kübik haritaları desteklemek, bir dokuya dönüştürmek vb.

OpenGL'ye bir doku yüklemek iki bileşenden oluşur:

  • Verileri resim biçiminizden alma. Bir dosyadan doku yükleyebilir veya yordamsal olarak oluşturabilirsiniz. Güzel bir renk bilgisi dizisiyle karşılaştığınız sürece önemli değil.

  • Verileri video kartına yerleştirme. Verilerin sistem RAM'inden video RAM'e gitmesi gerekir.

İlk bölüm kolay olmalı, çünkü SFML standart bir görüntü yükleyici ile birlikte gelir.

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

Ardından, bir OpenGL doku nesnesi oluşturmamız gerekecek.

GLuint texture_handle;
glGenTextures(1, &texture_handle);

Bir dokuyu bağlamak için bir dizi seçenek vardır. Üç ana tür vardır: 1D, 2D ve 3D ve cubemaps desteği var (+ X, -X, + Y, -Y, + Z, -Z). Bununla birlikte, vakaların% 99'unda 2D bir doku isteyeceksiniz.

glBindTexture(GL_TEXTURE_2D, texture_handle);

Şimdi ilginç kısma geçiyoruz. Verilerimizi video kartına yükleyelim.

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

Son olarak, bir dizi doku parametresi ayarlayabiliriz. Bu gibi soruları yanıtlayın: ya aralık dışında bir doku koordinatı kullanırsak (0.0, 1.0)? ( GL_REPEAT) Etrafına dolanıyor muyuz veya hiçbir şey yapmıyoruz ( GL_CLAMP)? Ayrıca, dokularımızda doğrusal enterpolasyon kullanmak istediğimizi video karta açıklamak için de kullanılabilirler.

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

Ve şimdi dokunuzu kullanarak dokuları bağlayabilmeli glBindTextureve dokulu kafesler çizmek için kullanabilirsiniz.


mmm, bunu denedim ve elde ettiğim tek şey beyaz bir küp: pastebin.com/nVQFAMRJ
— Darestium

glEnable(GL_TEXTURE2D);İnit işlevini koymayı deneyin .
— knight666

Harika, çalışıyor! Teşekkürler! BTW, bu işlev ne işe yarar? Tekstüre etme etkinleştirilsin mi?
— Darestium

Evet, 2B doku nesnesini açar, böylece doku verilerini alabilir. Başlatma sırasında yalnızca bir kez etkinleştirmeniz gerekir, ancak kodu yeni bir projeye kopyalarken sıklıkla unutulur. Ben dahil. ;)
— knight666

Çok güzel bir açıklama. Öğreticiler yazabilirsiniz!
— danijar

2

SFML 2.0+ doku yüklemeyi daha da kolaylaştırır;

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.