Come carico le trame con SFML per OpenGL?


Risposte:


16

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 glBindTexturee usarla per disegnare maglie strutturate.


mmm, ho provato a farlo e tutto quello che ottengo è un cubo bianco: pastebin.com/nVQFAMRJ
Darestium

Prova a inserire glEnable(GL_TEXTURE2D);la funzione init.
knight666,

Fantastico, funziona! Grazie! A proposito, cosa fa quella funzione? Abilitare il texturing?
Darestium,

Sì, attiva l'oggetto trama 2D, quindi può ricevere dati trama. Devi solo abilitarlo una volta all'inizializzazione, ma viene spesso dimenticato quando si copia il codice in un nuovo progetto. Me stesso incluso. ;)
knight666

Spiegazione molto bella. Potresti scrivere tutorial!
danijar,

2

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.