Partage
  • Partager sur Facebook
  • Partager sur Twitter

"Texture dimensions are limited to 2048x2048"

SDL_CreateTextureFromSurface

    27 avril 2019 à 23:49:50

    Bonsoir,

    Je crée ce sujet parce que j'ai un petit problème.

    Tout est plus ou moins dans le titre et sous-titre, mais je vais détailler quand même :)

    Je code en SDL2 et j'ai une image de 3552x584 pixels, qui contient un zombie animé.

    Du coup, je load l'image, je crée la texture et je crée aussi un SDL_Rect qui me sert à enregistrer la "découpe" de l'animation.

    Sur mon PC, tout roule à merveille, l'animation marche.

    Cependant, sur d'autres pc ayant une capacité moindre, le zombie ne s'affiche pas, la texture vaut NULL et l'erreur est : "Texture dimensions are limited to 2048x2048".

    J'ai regardé un petit peu sur le net, je n'ai trouvé que des réponses pas très précises (pour l'instant) et en anglais.

    J'aimerais donc savoir pourquoi cette limite existe. De plus, je ne sais pas comment résoudre ce problème ...

    Merci d'avance pour votre aide,

    Un petit geek

    • Partager sur Facebook
    • Partager sur Twitter
      28 avril 2019 à 11:45:49

      Hello,

      Déjà il ne faut pas que l'anglais te rebute. Pour citer l'intro du cours C++ sur Zestedesavoir :

      informaticienzero et mehdidou99 ont écrit:

      D’un point de vue plus général, si vous souhaitez continuer dans l’informatique et la programmation, il sera très difficile d’échapper à l’anglais. Beaucoup de cours, de documents, de forums sont en anglais, ou en font un usage massif. L’anglais est tout simplement la langue de l’informatique. Après, sachez que l’anglais informatique est simple à comprendre, car souvent écris par des gens dont l’anglais n’est pas la langue maternelle. Ainsi, inutile d’être bilingue, un bon dictionnaire ou un traducteur vous aideront.


      Si tu ne comprends pas des messages en anglais, tu peux utiliser Google Translate ou un dictionnaire - à force de rencontrer des termes en anglais tu vas t'y habituer, et d'ici quelques temps ton niveau en anglais aura énormément progressé.

      (personnellement c'est le fait de faire mes recherches en anglais qui m'ont permis d'acquérir un bon niveau en anglais - pour être honnête, les cours d'anglais qu'on a au collège/lycée apprennent juste la base, mais ce qui fait vraiment progresser une langue c'est la pratique)

      Maintenant pour l'erreur en elle même, effectivement moi même je dois faire une recherche sur internet, alors allons y :)

      https://discourse.libsdl.org/t/texture-dimensions-are-limited/23096/2

      AntTheAlchemist a écrit:

      Even though your destination rectangle is much smaller, the source texture still exists in hardware, so the texture size limit still applies. Your big texture still has to be in video RAM.


      Ce message est clair : c'est une limitation qui existe au niveau du hardware de ta machine, et plus précisément la quantité de RAM vidéo qu'elle a.

      Un autre site : https://gamedev.stackexchange.com/questions/111012/sdl2-not-rendering-larger-texture-to-smaller-texture

      congusbongus a écrit:

      When using textures, SDL is basically a shim over OpenGL/DirectX which talks directly with your graphics card. Texture size limits will depend on your hardware - better graphics cards can use larger textures.


      ça dépend en fait de ta carte graphique - si tu as un PC avec une vieille carte graphique, la résolution maximale que peut avoir une texture va varier.

      Comment pallier ça, je ne suis pas expert mais je dirais qu'il n'y a pas de solution miracle. Soit tu indiques clairement que ton application demande une certaine compatibilité (certains jeux ont un "système minimal" requis) - soit tu te débrouilles autrement en séparant ta texture en plusieurs plus petites textures, qui chacunes ne dépassent pas 2048x2048, mais je pense que ça ne doit pas être évident à faire. Sinon, tu réduis la taille de ta texture manuellement. J'avoue qu'une image de 3500 pixels de haut c'est peut-être un peu overkill, non ? ;p

      -
      Edité par potterman28wxcv 28 avril 2019 à 15:42:30

      • Partager sur Facebook
      • Partager sur Twitter
        28 avril 2019 à 15:07:23

        Salut,

        Très bonne réponde de @potterman28wxcv, je poste juste pour dire qu'on dit « pallier quelque chose » et pas « pallier à quelque chose ». ;)

        • Partager sur Facebook
        • Partager sur Twitter
        Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
          28 avril 2019 à 15:42:53

          yo@n97one a écrit:

          Salut,

          Très bonne réponde de @potterman28wxcv, je poste juste pour dire qu'on dit « pallier quelque chose » et pas « pallier à quelque chose ». ;)

          Ha merci, je fais tout le temps la faute. C'est corrigé.

          • Partager sur Facebook
          • Partager sur Twitter
            29 avril 2019 à 10:08:51

            Salut,

            Oui en effet,  plusieurs jeux proposent un rescale des textures pour les machines moins puissantes.

            En gros, tu as un grosse texture, tu essaies de la monter en VRAM, et si tu te prends un message qui dit que ce n'est pas supporté, tu la rescale a 50% (en x et en y) et tu réessaies. 

            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              29 avril 2019 à 11:16:33

              Salut,

              Cette limitation est matérielle. En gros, la SDL veut bien le faire, mais lors du passage à la Vram, c'est la GPU qui refuse la texture.

              Par exemple, chez moi cette limitation est de 8192*8192. Donc mon jeu de tuiles de 3968*3456 passe sans souci.

              Dans les 2 cas, (animation ou jeu de tuiles), il est quand-même préférable de trier. Par exemple, ma source fait 128*108 tuiles, sauf que dans les faits je n'en utilise que 20 ou 30 par carte, on a donc tout intérêt à recréer un jeu de tuile par carte avec uniquement celles qui sont utiles afin de limiter les dimensions de la texture et assurer un fonctionnement sur une bécane moins puissante.

              La SDL 2 est passée à la 3D parce que c'est nécessaire pour attaquer les GPU modernes qui ne savent faire que ça. Les textures sont donc, dans les faits, destinées à être appliquées sur des polygones, de telles dimensions surpassent les affichages moyens, donc les chances d'un tel besoin sont quasi nulles. La 2D est finalement devenue un polygone rectangle unique au plus près de la caméra...

              La solution qu'il te reste est de découper ton sprite sheet en actions, avoir une texture pour "marcher", une pour "courir" etc. Je ne sais pas comment tu organises ta planche d'animation, mais perso, je met une action par ligne et les images en colonnes pour au final gérer une matrice animation[ACTION][FRAME] que les index soient des rangs au seins d'une même texture ou une texture en plein ne change pas grand chose à la gestion.

              @Fvirtman : Je ne pense pas qu'on puisse prendre la main entre le chargement d'une image et le passage en Vram de la texture, du coup il risque d'être difficile de redimensionner artificiellement la texture. Par contre L'idée est très bonne. Ce doit être possible en passant par une surface, structure beaucoup plus souple. Donc charger sous forme de surface, en faire une texture et voir si ça passe. sinon, recréer une surface avec de nouvelles dimensions plus petites, appliquer dessus la surface originale avec une mise à l'échelle (SDL_BLitScaled()), et retenter la texture... Tant que ça ne passe pas. Ensuite, lors de l'affichage tu peux utiliser SDL_RenderCopyEx() et modifier le ratio pour revenir à l'échelle 1. Au prix d'une perte de définition du personnage.

              Bonne continuation.

              -
              Edité par drx 29 avril 2019 à 11:18:53

              • Partager sur Facebook
              • Partager sur Twitter

              Bonhomme !! | Jeu de plateforme : Prototype.

                29 avril 2019 à 12:06:03

                Ah oui, je pense que le rescale est en amont de la création de texture : car c'est au moment de la création de texture que ça échoue.

                Donc il faut agir en amont avec un rescale manuel sur la surface en RAM.

                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  1 mai 2019 à 21:38:35

                  Bonsoir,

                  Merci beaucoup à vous pour toutes vos réponses ! 

                  Je vais regarder tout ça et je vous dirai si je réussis. Merci pour vos explications claires :D

                  Et promis potterman28wxcv, je bosse mon anglais ... :p mais je sais que c'est très important en informatique, c'est seulement que j'ai beaucoup de mal encore ^^

                  Bonne soirée à vous et merci :)

                  Un petit geek


                  EDIT 1 :

                  Excusez moi du retard de mes réponses par rapport aux vôtres, je suis en période d'examens alors je peux pas trop coder :'( xD

                  drx, merci pour tes précieuses explications. Je pense que du coup, je vais séparer ma palette d'animations (palette, grande image, tuile ... je sais jamais comment ça s'appelle xD) en images uniques contenues dans un dossier, et au moins je n'aurai aucune erreur.

                  Mais une chose m'inquiète : comment faire lorsque l'on a une "image géante" (qui nous sert de fond sur lequel, en bougeant notre personnage, ça va scroller verticalement ou/et horizontalement) par exemple ? Faudra-t-il faire plein de petites images aussi, inférieures à X*X ? 

                  parce qu'il me semble bizarre de devoir dire à l'utilisateur que la qualité du jeu sera moindre sur son PC à cause du matériel, alors que la SDL est censée tourner tranquillement même sur une antiquité ... xD à moins que je ne me trompes ...

                  et potterMan, mon image ne fait pas 3500 de haut mais de large ! :p je te la linke si tu veux. Celle là est plus petite parce qu'il y a moins d'animations :p

                  ZombieQuiSortDeTerre

                  En tout cas, il faut que je teste le rescale, pour voir quelle solution est la plus simple et la plus efficace aussi.

                  Merci pour votre aide et vos commentaires qui m'aident tant ! :)

                  -
                  Edité par Diablo-hell 8 mai 2019 à 1:26:30

                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 mai 2019 à 19:30:21

                    Salut,

                    Si utiliser de grandes images peut sembler pratique, ce n'est pas ce que l'on fait en général. Les pratiques développées lors de l'ère obscure des grandes limitations restent valables de nos jours.

                    Pour le scrolling, il peut s'agir soit de petites images mises bout à bout, soit d'une seule qui se répète. Par exemple, pour le scrolling de mon shooter je mets à la suites des images de 1280*720 (en les faisant revenir de temps en temps). ça reste de grandes images et assez peu optimisé, mais c'est un luxe que l'on peut se permettre aujourd'hui.

                    Dans 10 ou 20 ans, tu pourras peut-être ne plus avoir à te poser la question et avoir une image unique de 300 000 * 2000 pour assurer le scroll de tout un niveau très long. Mais pas là...

                    Ceci dit, en y regardant de plus près, ta limitation n'en est pas vraiment une. Le refus de ta texture ne signifie pas que tu manques de mémoire, il faut juste plus de textures plus petites.

                    Il faut aussi bien faire attention à éviter l'overkill. Pourquoi ton image est-elle aussi large ? Est-ce parce qu'il y a beaucoup d'images ou bien ton personnage a-t-il une définition élevée ? Par exemple si ton bonhomme fait 120px de large alors qu'il ne sera affiché que sur 60, alors la définition est trop élevée.

                    Ensuite, il n'est pas bizarre de dire à l'utilisateur que la qualité sera moindre sur sa bécane parce qu'elle est moins performante. Les gamers vivent ça tous les jours. Je mets tout à fond sur mon PC de bureau et je fais des concessions quand je joue sur mon portable (définition, shaders, anticrénelage et j'en passe) : c'est la vie.

                    Bonne continuation.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bonhomme !! | Jeu de plateforme : Prototype.

                      9 mai 2019 à 19:57:57

                      Salut,

                      Merci, je ne savais pas :)

                      Oui, c'est vrai que je peux tout simplement loader plein de petites images au lieu d'une énorme, ça me parait plus raisonnable aussi, c'est seulement que je pensais que cette méthode était dépassée, mais pas encore apparemment :p

                      en fait ma grande image, c'est celle que je t'ai envoyé plus haut, dans EDIT 1. Elle contient toutes les animations de quand le zombie marche. Je trouvais ça plus "pro" même si c'est un bien grand mot xD 

                      Et mon zombie est gros oui, mais je l'affiche à taille réelle. Je vais certainement réduire, je voulais juste tester :)

                      Merci pour tes conseils.

                      Je vais donc séparer mes animations pour que ça ne plante plus pour rien, et ça ne changera rien en soi.

                      Voici le genre d'images géantes que j'utilise :

                      ZombieQuiSortDeTerre

                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 mai 2019 à 19:59:34

                        Fvirtman a écrit:

                        Salut,

                        Oui en effet,  plusieurs jeux proposent un rescale des textures pour les machines moins puissantes.

                        En gros, tu as un grosse texture, tu essaies de la monter en VRAM, et si tu te prends un message qui dit que ce n'est pas supporté, tu la rescale a 50% (en x et en y) et tu réessaies. 

                        Forget about it , ce que j'apportais a deja ete dit :)

                        -
                        Edité par CrevetteMagique 9 mai 2019 à 20:00:25

                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 mai 2019 à 20:28:07

                          Re,

                          Ton zombie est énorme, un peu plus de 165*285. affiche ton image à l'échelle 1 et tu vas voir ce à quoi il va ressembler dans ton jeu. Es-tu sûr de toi ? Quelle définition vises-tu pour ton jeu ?

                          Ensuite la ligne du haut et du bas sont les mêmes, il y en a donc une d'inutile. Pour avoir une image d'en bas, il suffira de prendre celle du haut et de faire un flip horizontal. Déjà, moitié moins d'images..

                          Bon, là il est plutôt en train de sombrer dans des sables mouvants que de marcher.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Bonhomme !! | Jeu de plateforme : Prototype.

                            9 mai 2019 à 20:46:19

                            Re,

                            Zérotisme j'ai pas compris ... ^^ 

                            Et drx, en gros mon jeu ressemble à ça pour l'instant :

                            C'est encore très rudimentaire xD et c'était juste pour m'amuser.

                            Mais du coup ... je pensais le passer en plein écran à terme, et faire des zombies plus petits oui. En fait là c'est juste un mini jeu où tu as 15 secondes pour buter le plus de zombies :p

                            Et c'est vrai pour la ligne du bas, mais je ne sais pas trop comment m'y prendre pour le flip, je vais regarder ça. De toute manière, c'est la longueure horizontale qui était trop grande, mais je vais voir quand même merci :D

                            (D'ailleurs aussi, j'ai testé sur les ordis du lycée (les bons vieux ordis là) eh ben ... pas de plantage, mon zombie s'affichait :o donc ils ont l'air plus puissants que ceux avec lesquels ça marchait pas ... :o xD)

                            Merci pour vos conseils ! :)

                            EDIT : C'est bon, j'ai trouvé et testé, je peux flip l'image horizontalement avec SDL_RenderCopyEx, grâce au dernier paramètre, "const SDL_RendererFlip flip" (voir ici https://wiki.libsdl.org/SDL_RendererFlip) :D merci drx ;)

                            -
                            Edité par Diablo-hell 9 mai 2019 à 21:47:49

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 mai 2019 à 22:17:11

                              Diablo-hell a écrit:

                              Re,

                              Zérotisme j'ai pas compris ... ^^ 

                              Et drx, en gros mon jeu ressemble à ça pour l'instant :

                              C'est encore très rudimentaire xD et c'était juste pour m'amuser.

                              Mais du coup ... je pensais le passer en plein écran à terme, et faire des zombies plus petits oui. En fait là c'est juste un mini jeu où tu as 15 secondes pour buter le plus de zombies :p

                              Et c'est vrai pour la ligne du bas, mais je ne sais pas trop comment m'y prendre pour le flip, je vais regarder ça. De toute manière, c'est la longueure horizontale qui était trop grande, mais je vais voir quand même merci :D

                              (D'ailleurs aussi, j'ai testé sur les ordis du lycée (les bons vieux ordis là) eh ben ... pas de plantage, mon zombie s'affichait :o donc ils ont l'air plus puissants que ceux avec lesquels ça marchait pas ... :o xD)

                              Merci pour vos conseils ! :)

                              EDIT : C'est bon, j'ai trouvé et testé, je peux flip l'image horizontalement avec SDL_RenderCopyEx, grâce au dernier paramètre, "const SDL_RendererFlip flip" (voir ici https://wiki.libsdl.org/SDL_RendererFlip) :D merci drx ;)

                              -
                              Edité par Diablo-hell il y a 27 minutes


                              Ton jeu a l'air bien , lache pas ton projet.
                              Je disais simplement : Oubliez ca , ce que j'ai dit a deja ete dit avant :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 mai 2019 à 0:52:55

                                Zérotisme a écrit:

                                Ton jeu a l'air bien , lache pas ton projet.
                                Je disais simplement : Oubliez ca , ce que j'ai dit a deja ete dit avant :)

                                Merci beaucoup, je le lâche pas haha, j'ai plein d'idées :D

                                Bonne soirée et merci Zérotisme :p

                                • Partager sur Facebook
                                • Partager sur Twitter

                                "Texture dimensions are limited to 2048x2048"

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown