Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL2] fullscreen + basse definition

Sujet résolu
    27 avril 2019 à 19:22:08

    Bonjour,

    Je suis sur un projet SDL2 que je veux faire en basse définition (320*224 en 4/3 - 336*210 en 16/10 et 426*240 en 16/9) pour avoir du gros pixel du genre du jeu kingdom classic.

    Certains éléments du jeu sont issues d'une texture appliquée plusieurs fois en subissant une mise à l'échelle allant de 0.1 à 1.0.

    Lorsque le jeu est dans une fenêtre, les plus petits éléments résultent en un unique pixel, c'est logique et ça me va très bien.

    Le souci est que lors du passage en plein écran, ces éléments sont affichés à une résolution supérieure à celle attendu.

    Par exemple en 16/10 chez moi, un pixel "jeu" correspond à 5*5 pixels moniteur, je supposais donc que le plus petit élément affiché ferait au minimum 5*5 pixels affichés, hors ces éléments sont affichés avec la résolution d'affichage, j'ai donc des pixels en dessous de 5*5.

    ici en fenêtre on voit que la plus petite goutte de pluie fait 1 pixel :

    En plein écran, on voit que la plus petite a une définition plus élevée, le perso en référence donne les dimension du pixel "jeu" :

    J'ai testé différents paramètres que j'ai trouvés dans la doc, mais rien n'y fait...

    Quelqu'un aurait-il une solution à ce genre de problème ?

    Merci.

    • Partager sur Facebook
    • Partager sur Twitter

    Bonhomme !! | Jeu de plateforme : Prototype.

      28 avril 2019 à 23:28:20

      Salut !

      Ce que je trouve étrange, c'est que visiblement, ton bonhomme a bien été zoomé et pixelisé (ce que tu attends), mais pas ta goutte d'eau.

      Comment sont ces deux ressources en mémoire ?

      Est ce que tu es passé par la même fonction pour les charger et les afficher ? c'est tous les deux des SDL_Texture ?  ou fais tu varier des paramètres ?

      • Partager sur Facebook
      • Partager sur Twitter

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

        29 avril 2019 à 0:29:48

        Salut,

        Ce sont bien toutes des textures. Je ne passe pas par les même fonctions, l'une est une gestion de mes sprites et l'autre est en charge des particules de la météo, une texture unique affichée à différents ratios avec une rotation.

        Les formats sont standards, je passe tous mes chargements de fichier par des fonctions à moi dans laquelle je fais en sorte de tout formater pour être certain de toujours être compatible avec le reste de ma lib. Question de pratique pour ne pas avoir à gérer les différents formats lorsque j'ai besoin d'attaquer une texture ou une surface.

        Je pense que le problème vient du fait que mes particules ont une échelle décimale. Mais même les plus grosses ne respectent pas les placements des pixels logiques. Elles présentent des pixels inclinés :

        alors que le résultat attendu serait plutôt de ce style :

        Là, c'est une impression d'écran du fenêtré par 5.

        En relevant des paramètres, je me suis rendu compte que la taille "logique" (via SDL_RenderGetLogicalSize) du render reste inchangée (336*210) en fullscreen, mais la taille d'affichage (SDL_GetRendererOutputSize) correspond à celle de mon écran 1680*1050.

        Du coup, je pense que l'application des textures se fait sur la définition d'affichage et non la définition "logique". Les textures appliquées doivent être étirées proportionnellement à l'output/logic, ce qui n'interdit plus l'affichage d'un pixel inférieur en taille au pixel logique.

        J'ai essayé avec les SDL_RenderSetScale, SDL_SetIntegerScale pour voir les différents cas de mise à l'échelle mais rien n'y fait.

        Je n'ai pas bossé dessus aujourd'hui, mais j'ai eu une idée à tester pour voir si passer par une texture intermédiaire (336*210) via SDL_SetRenderTarget ne pourrait pas résoudre le souci. Une fois finalisée, c'est elle qui serait étirée et appliquée sur le renderer.

        J'y ai pensé plus tard, mais tester un SDL_DrawPoint() en fullscreen devrait me permettre d'étayer mes suppositions... ou pas.

        Je testerai demain et je te dirai quoi...

        Merci.

        EDIT (24 h):

        Re,

        Bon effectivement, passer par une texture basse définition en guise de renderer avant la poser sur le renderer final a fait le boulot.

        Par contre, le drawPoint créé bien un pixel logique (le jaune), donc de 5*5 pixels affichés en fullscreen...

        Bon... Mystère à noter dans un coin pour la prochaine fois.

        Encore une journée de perdue sur un truc à la con alors que ça apparaît évident après un peu de repos... Vendredi, j'ai passé 2 heures à ne pas voir un point-virgule en fin de ligne d'un for()... Faut pas vieillir...

        Merci pour ton aide.

        -
        Edité par drx 29 avril 2019 à 12:19:07

        • Partager sur Facebook
        • Partager sur Twitter

        Bonhomme !! | Jeu de plateforme : Prototype.

          30 avril 2019 à 23:02:52

          Ouais, c'est vrai que c'est bizarre tout ça. J'ai pas eu le temps d'essayer.

          Mais pour les gouttes, on aurait dit que l'une avait été tournée de manière software, et l'autre de manière hardware (avec antialiasing et autres corrections qui vont bien).

          Un peu comme si dans un cas tu tournes an mode CPU sans aucun filtre, et puis tu balances à la carte

          et l'autre tu balances à la carte et tu lui dis de tourner.

          • Partager sur Facebook
          • Partager sur Twitter

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

          [SDL2] fullscreen + basse definition

          × 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