NeHe'nin doku haritalama eğitimine bakıyorum . Sadece bir doku yüklemek için aşırı karmaşık görünüyor.
SFML'ye bir doku yüklemenin ve sonra Open GL'de kullanmanın bir yolu var mı? Pencerem için SFML kullanıyorum.
NeHe'nin doku haritalama eğitimine bakıyorum . Sadece bir doku yüklemek için aşırı karmaşık görünüyor.
SFML'ye bir doku yüklemenin ve sonra Open GL'de kullanmanın bir yolu var mı? Pencerem için SFML kullanıyorum.
Yanıtlar:
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 glBindTexture
ve dokulu kafesler çizmek için kullanabilirsiniz.
glEnable(GL_TEXTURE2D);
İnit işlevini koymayı deneyin .
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