CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Bug avec SDL(_image) et OpenGL

Aldebran
Aldebran
Niveau 10
31 janvier 2009 à 21:00:52

Salut tout le monde, je programme sous linux et j'ai un problème avec la fonction IMG_Load() (et aussi avec SDL_LoadBMP()). En fait, j'essaye de charger une texture pour OpenGL mais quand je charge l'image avec SDL et que je fait ça :

SDL_Surface* s = IMG_Load(file);
printf("%d\n", s->format->BytesPerPixel);

Je m'aperçois que le nombre d'octets par pixels de l'image est toujours 1, et ça avec IMG_Load ou SDL_LoadBMP. Or l'image sur laquelle je travaille est en couleur !
Dans mon code, je vérifie que le chargement de l'image s'est bien déroulé avec un test d'erreur, et visiblement IMG_Load() me charge bien mon image sans problème, alors pourquoi ce n'est pas le bon format ?

D'ailleurs, quand je fait :

printf("%d\n", s->w);

J'obtiens la bonne valeur, ça prouve que le chargement de l'image se déroule bien.

Et au final, lorsque j'essaye d'afficher mon quad texturé, j'obtiens juste un quad tout blanc :/

Aldebran
Aldebran
Niveau 10
01 février 2009 à 13:20:06

Ah et j'ai oublié de préciser que l'image que je charge est en format PNG (que j'ai aussi converti en BMP pour pouvoir tester avec SDL_LoadBMP).

dnob700
dnob700
Niveau 10
01 février 2009 à 17:02:15

On n'a pas assez d'info pour t'aider évidement. Essaye de trouver un bout de programme le plus court possible qui illustre ce problème et poste le sur un wall pour qu'on puisse le regarder.

Aldebran
Aldebran
Niveau 10
01 février 2009 à 20:13:33

En fait, j'ai donné à peu près autant d'info que ce que j'ai. Voilà un code source que j'ai testé et qui ne marche pas (même erreur que ce que j'explique plus haut) : http://www.codeswall.info/source-135.html

dnob700
dnob700
Niveau 10
01 février 2009 à 20:48:12

Avec moi ça fonctionne bien (une fois qu'on rajoute les includes qui manquent) (j'obtiens le nombre 3 octets/pixel).

Est-ce que tu es sûr que l'image que tu veux ouvrir est bien un bitmap et qu'il est correctement enregistré (si tu es sous windows, je peut imaginer que paint utilise des extensions à lui pour sauvegarder des bitmap) ?

Si tu peut le faire, upload ton chipset.bmp aussi.

Aldebran
Aldebran
Niveau 10
01 février 2009 à 21:38:17

"une fois qu'on rajoute les includes qui manquent"

Bizarre, je viens de remarquer qu'en effet il manque des include, mais pourtant ça compile sans problème et ça s'exécute aussi sans problème (à part celui du format d'image), sans doute une bizarrerie de g++.

Voilà l'image format PNG avec laquelle j'ai ce problème (pour cette image j'utilise IMG_Load()).

http://img237.imageshack.us/my.php?image=chipsetmv6.png

Je pense que le BitMap est correctement enregistré, je suis sous Linux et j'ai converti en BMP avec The Gimp. Pour le PNG je suis pas sûr car je l'ai téléchargé sur internet.

Le problème peut aussi venir de la SDL sur mon ordi, mais je vois pas trop pourquoi. J'essayerais de compiler sous windows pour voir.

dnob700
dnob700
Niveau 10
01 février 2009 à 21:43:19

Ben, ton fichier est stocké avec un octet par pixel, donc il n'y a pas de bogue pour l'instant.

godrik
godrik
Niveau 30
01 février 2009 à 22:21:30

Je confirme ce que dit dnob:
$ file /tmp/chipsetmv6.png
/tmp/chipsetmv6.png: PNG image data, 480 x 256, 8-bit colormap, non-interlaced

8-bit colormap. Je pense que ca veut dire que les couleurs sont indexe. Tu as dans le fichier une table des couleurs (de taille inferieur a 256) et chaque pixel de ton image prends sa couleur dans la table. Ainsi il n'y a bien que 8 bit par pixel.

Aldebran
Aldebran
Niveau 10
02 février 2009 à 09:36:51

Arf ok, et SDL retourne une image avec les couleurs indexées dans ce cas là ? Comment je peux faire pour que SDL me retourne un image où j'aurais trois couleurs par pixels ?

Parce que forcément, quand je fais ça ensuite :

glTexImage2D(GL_TEXTURE_2D, 0, 3, s->w, s->h, 0, GL_RGB, GL_UNSIGNED_BYTE, s->pixels);

Je vais obtenir une erreur de segmentation qui sera corrigée en remplaçant le 3 et le GL_RGB par s->format->BytesPerPixel mais le quad que je vais essayer de texturer avec cette texture va être tout blanc :S

Bon, je vais essayer de changer le format de l'image, ce sera déjà ça :)

Aldebran
Aldebran
Niveau 10
02 février 2009 à 09:50:36

C'est bon le problème est corrigé, thanks :)

godrik
godrik
Niveau 30
02 février 2009 à 15:21:34

racontes nous comment tu as fait.

Aldebran
Aldebran
Niveau 10
02 février 2009 à 19:16:30

En fait j'ai juste converti le BMP avec couleur indexée en BMP format RVB, ça suffit à résoudre mon problème. C'est sûr que ça serait mieux si j'arrivais à manipuler une image avec des couleurs indexées, mais vu que dans mon code après je dois en plus effectuer un traitement sur chaque pixel de la surface, je préfère ne pas trop compliquer les choses.

dnob700
dnob700
Niveau 10
02 février 2009 à 23:37:01

Je ne crois pas que ce soit possible. Car le format des textures pour OpenGL est constant dans une application (il ne vas pas stocker, une table pour chaque image, ce n'est pas du tout optimisé comme ça).

Par contre, peut-être que SDL peut convertir l'image directement dans une représentation 24 ou 36 bits. Mais c'est aussi simple de faire ce que tu as fait.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment