Sto guardando il tutorial sulla mappatura delle texture di NeHe . Sembra troppo complicato per il solo caricamento di una trama.
C'è un modo per caricare una trama in SFML e poi usarla in Open GL? Uso SFML per i miei finestrini.
Sto guardando il tutorial sulla mappatura delle texture di NeHe . Sembra troppo complicato per il solo caricamento di una trama.
C'è un modo per caricare una trama in SFML e poi usarla in Open GL? Uso SFML per i miei finestrini.
Risposte:
Benvenuto in OpenGL, dove le cose veloci arrivano gratis e le cose facili sono rese difficili.
Se pensavi che il campione fosse lungo e complicato, "solo per caricare una trama", allora non hai ancora visto nulla. Attendi fino a quando non devi caricare trame DDS, elaborare trame HDR, supportare cubemap, renderizzare su una trama, ecc.
Il caricamento di una trama in OpenGL è costituito da due componenti:
Ottenere i dati dal formato immagine. È possibile caricare una trama da un file o generarla proceduralmente. Non importa, purché si finisca con una buona gamma di informazioni sul colore.
Mettere i dati sulla videocard. I dati devono passare dalla RAM di sistema alla RAM video.
La prima parte dovrebbe essere semplice, poiché SFML viene fornito con un caricatore di immagini standard.
sf::Image img_data;
if (!img_data.LoadFromFile("images/avatar.png"))
{
LOG_ERROR("Could not load '%s'.", "images/avatar.png");
return false;
}
Successivamente, dovremo generare un oggetto texture OpenGL.
GLuint texture_handle;
glGenTextures(1, &texture_handle);
Esistono diverse opzioni per rilegare una trama. Esistono tre tipi principali: 1D, 2D e 3D e hai il supporto per le cubemap (+ X, -X, + Y, -Y, + Z, -Z). Tuttavia, nel 99% dei casi, vorrai una trama 2D.
glBindTexture(GL_TEXTURE_2D, texture_handle);
Ora arriviamo alla parte interessante. Carichiamo i nostri dati sulla scheda video.
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
img_data.GetWidth(), img_data.GetHeight(),
0,
GL_RGBA, GL_UNSIGNED_BYTE, img_data.GetPixelsPtr()
);
Infine, possiamo impostare una serie di parametri di trama. Queste risposte a domande come: cosa succede se usiamo una coordinata di trama che è al di fuori dell'intervallo (0.0, 1.0)? Facciamo un giro ( GL_REPEAT
) o non facciamo nulla ( GL_CLAMP
)? Possono anche essere usati per spiegare al videocard che vogliamo usare l'interpolazione lineare sulle nostre trame.
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);
E ora dovresti essere in grado di legare la tua trama usando glBindTexture
e usarla per disegnare maglie strutturate.
glEnable(GL_TEXTURE2D);
la funzione init.
SFML 2.0+ semplifica ulteriormente il caricamento di una trama;
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