| | [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? | |
| | Auteur | Message |
---|
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? Jeu 29 Jan 2015 - 2:06 | |
| Ça fait cinq heures que je me tape la tête sur les murs pour expédier une bitmap à OpenGL. Le but est de bitmasker les infos d'une tile (id, luminosité) sur un std::uint8_t, tout bourrer dans une texture de la taille de la map, et refaire du bitmasking dans le fragment shader pour extraire le tout. Ça ressemble à ça : - Code:
-
std::vector<TileData> bitmap(borderWidth() * borderHeight());
std::generate(bitmap.begin(), bitmap.end(), [this, i = std::uint8_t(0)]() mutable { return 255 * (i = !i); });
gl::Texture bitmapTex; bitmapTex.bind(); TRY_GL(glTexStorage2D(GL_TEXTURE_2D, 1, GL_R8UI, borderWidth(), borderHeight())); TRY_GL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, borderWidth(), borderHeight(), GL_RED_INTEGER, GL_UNSIGNED_INT, bitmap.data())); bitmapTex.unbind(); gl::Texture est un bête wrapper qui fait ça dans son constructeur : - Code:
-
TRY_GL(glGenTextures(1, &_id)); TRY_GL(glBindTexture(GL_TEXTURE_2D, _id)); TRY_GL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); TRY_GL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); TRY_GL(glBindTexture(GL_TEXTURE_2D, 0)); J'ai déjà donné une bonne poignée d'heures à leurs fonctions d'alignement débiles, et ajouté ça au prototype (qui du coup marche nickel) : - Code:
-
TRY_GL(glPixelStorei(GL_PACK_ALIGNMENT, 1)); TRY_GL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); TRY_GL(glEnableClientState(GL_VERTEX_ARRAY)); Et quand je transplante ça dans mon vrai projet, presto ! Bouillie de pixels qui s'en*hum*, joyeux largage de garbage dans ma VRAM (à un moment j'ai même localisé un truc qui semblait être la position de ma souris sur deux entiers 32bits). Ça clignote, ça segfaulte même de temps en temps (mais j'ai pas réussi à l'attraper au débugueur), mais ça me donne aucune info. Au secours. _________________ Home is not a place, it's a feeling.
Dernière édition par D-z le Jeu 29 Jan 2015 - 15:47, édité 1 fois |
| | | onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? Jeu 29 Jan 2015 - 10:10 | |
| Bon j'ai jamais trop poussé la créations de textures donc ce que je dis est a prendre avec des pincettes, mais je suis pas sur que ce soit une bonne idée de faire un glTexSubImage2D sans avoir fait de glTexImage2D. De souvenir cette fonction ne sert pas allouer la mémoire, mais plutôt a envoyer des pixels sur une 'texture' déjà crée.
Du coup tu devrais faire:
bitmapTex.bind(); TRY_GL(glTexImage2D(GL_TEXTURE_2D, 0, 1, borderWidth(), borderHeight(), 0, GL_RED, GL_UNSIGNED_INT, bitmap.data())); bitmapTex.unbind();
|
| | | D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? Jeu 29 Jan 2015 - 12:42 | |
| Le glTexStorage2D vient de cette doc, c'est censé faire la même chose qu'un glTexImage2D sans data. D'ailleurs j'avais un glTexImage2D avant et ça fait la même chose :/ _________________ Home is not a place, it's a feeling.
|
| | | onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? Jeu 29 Jan 2015 - 13:33 | |
| Ok, connaissais pas, bizarre dans tous les cas. Déjà, est ce que ça fonctionne ce code de base (texture vide)? - Code:
-
int wid = 64, hei = 64; unsigned int texid; glGenTextures(1, &texid); glBindTexture(GL_TEXTURE_2D, texid); glTexImage2D(GL_TEXTURE_2D, 0, 4, wid, hei, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); Puis ensuite: - Code:
-
int wid = 64, hei = 64; std::vector<int> data(wid*hei); for(int i=0; i<wid; ++i) for(int j=0; j<hei; ++j) data[i+j*wid] = i*j; unsigned int texid; glGenTextures(1, &texid); glBindTexture(GL_TEXTURE_2D, texid); glTexImage2D(GL_TEXTURE_2D, 0, 4, wid, hei, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); |
| | | D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? Jeu 29 Jan 2015 - 15:47 | |
| J'ai fini par craquer et appliquer la technique du bulldozer : hg revert et recommencer la transplantation de zéro. Et ce coup-ci ça marche. Nous ne saurons malheureusement jamais ce qui a causé ce bug, mais je peux continuer mon projet qui est bien à la bourre. Amen ! _________________ Home is not a place, it's a feeling.
|
| | | onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? Jeu 29 Jan 2015 - 16:35 | |
| Ahah dommage, mais oui tout refaire ça marche bien dans pas mal de cas |
| | | Contenu sponsorisé
| Sujet: Re: [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? | |
| |
| | | | [Nuked] Doctissimo : Mon OpenGL fume de la moquette, que faire ? | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |