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.