IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XNA/Monogame Discussion :

[HLSL] Liste de plusieurs lumières


Sujet :

XNA/Monogame

  1. #1
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut [HLSL] Liste de plusieurs lumières
    Bonjour à tous,

    Dans l'optique d'un moteur 3D gérant des scènes avec plusieurs lumières, je souhaiterais savoir comment je peux gérer dynamiquement une liste de lumières dans mon shader HLSL. J'ai regardé du côté de la doc MSDN mais je n'ai pas trouvé comment gérer des listes en HLSL (en tous cas, pas de liste de plus de 4 éléments, c'est très limitant ^^).
    L'idée serait que je fasse un truc du genre :

    côté c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    effect.setParameter["tableauDesPositionsDesLumieres"].SetValue(tableauDesPositionsDesLumieres);
    // avec tableauDesPositionsDesLumieres de type Vector3[]
    effect.setParameter["tableauDesIntensitesDesLumieres"].SetValue(tableauDesIntensitesDesLumieres);
    // avec tableauDesIntensitesDesLumieres de type Vector[]
    ...
    et côté HLSL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ??? c'est là que je bloque
    Si quelqu'un sait comment je pourrais m'y prendre (si c'est faisable), je suis preneur. À noter que pour pouvoir tourner sur des configs pas trop gourmande, j'essaye me limiter actuellement au :
    • Vertex shader v1.1
    • Pixel shader v2.0

    Si vraiment c'est indispensable, je pourrai envisager d'augmenter ces versions mais si c'était possible de rester sur ces versions, ça m'arrangerait.

    Merci d'avance de vos réponses.
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Salut,

    Je ne connais pas le HLSL, mais en GLSL je passerai une texture 1D RGBF32 avec la position de chaque lumière.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  3. #3
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Pas bête du tout ça !! (comment j'y ai pas pensé plus tôt).
    En effet, j'ai déjà vu ce genre de technique dans des tutos sur les shaders. J'essaye de suite...
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  4. #4
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Pour indexer des paramètres (vs/ps input, constants, textures), les anciennes versions (1.1, 2.0) sont très très limitées. Ce sont juste des versions un peu améliorées des anciens fixed pipeline. <- il y a beaucoup de choses qui ne sont possibles qu'en emulation software : substituer les lumières avant un draw call par exemple. Mais si ton jeu est en mode 1.1/2.0 il n'est peut-être pas très gourmand en CPU et donc ça peut passer.

    Dans les dernières versions (shader 4/5), tu peux indexer tout avec tout quasiment y compris lire les informations de matériel depuis une texture. Ceci dit même avec une version récente ça peut rester une arbitration entre coût CPU et coûts GPU sans parler de certaines limitations des techniques dites "deferred shading" (où les infos de matériels sont sauvés dans une texture).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Le souci, c'est que je ne suis pas certain que mon ordi portable permette d'aller jusqu'au versions 4-5 des shaders (c'est un chipset intégré) et donc je souhaite limiter au maximum la config nécessaire pour faire tourner mon moteur. C'est pour cela que je me limite à ces versions-là pour le moment.

    Pour en revenir à ma question d'origine, j'ai effectué des tests pour pouvoir enregistrer mes positions de lumières dans une texture… mais je me suis rendu compte qu'une texture stockait des couleurs, donc des bytes de 0 à 255 : comment stocker des positions qui peuvent potentiellement aller de -∞ à +∞ du coup ?
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  6. #6
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    tu utilises des textures à précision flottantes (formats 32F, 16F etc).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  7. #7
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Je ne savais qu'il existait de telles textures. Mais en fouinant sur le net, j'ai fini par trouver une solution qui semble pas mal du tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Texture2D spotLightsPositionsTexture = new Texture2D(device, sceneLights.Count, 1, 1,
    	TextureUsage.None, SurfaceFormat.Vector4);
    List<Vector4> spotLightsPositions = new List<Vector4>();
    for (int i = 0; i < sceneLights.Count; i++)
    	spotLightsPositions.Add(new Vector4(sceneLights[i].Position, sceneLights[i].Intensity));
    spotLightsPositionsTexture.SetData<Vector4>(spotLightsPositions.ToArray());
    String fileName = "spots " + DateTime.Now.ToString("dd-MM-yyyy HH.mm.ss.fff") + ".png";
    spotLightsPositionsTexture.Save(fileName, ImageFileFormat.Png);
    En ouvrant ensuite l'image sauvegardée, je retrouve trois pixels, pile le nombre de lumières dans ma scène

    J'ai par contre été contraint de faire mes tests sur une config un peu meilleure que celle de mon portable car sur ce dernier, j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The device does not support creating a texture of the given format with the given TextureUsage.
    Je suppose que c'est un problème de fonctionnalité non suportée par la carte graphique de l'ordinateur portable. Je vais devoir trouver une solution un peu moins évoluée si je veux pouvoir continuer à faire tourner mon moteur sur mon portable.

    Je note toutefois le sujet comme résolu. Merci beaucoup pour vos réponses.
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  8. #8
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Je suppose que c'est un problème de fonctionnalité non suportée par la carte graphique de l'ordinateur portable. Je vais devoir trouver une solution un peu moins évoluée si je veux pouvoir continuer à faire tourner mon moteur sur mon portable.
    Ben oui de toute façon même si tu arrivais à encoder ta lumière dans une texture, tu rencontrerais le problème de ton profil shader trop limité.

    Si vraiment tu veux aller dans la voie des effets de lumière complexes, je te conseille d'upgrader ton portable (avec GPU distinct NVIDIA et pas intégré Intel si possible) ils en font des compatibles Dx11 pour pas cher ces temps-ci.

    Sinon si tu vises le bas de bas de gamme (jeu qui tourne sur PC de 2002), alors tu dois sérieusement réviser tes ambitions à la baisse : simple texturing * diffuse, une lumière à la fois, pas d'ombres ou ombres sous forme de texture projetée etc.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/04/2007, 18h11
  2. Réponses: 14
    Dernier message: 26/05/2006, 18h45
  3. Réponses: 4
    Dernier message: 23/09/2005, 13h29
  4. [Struts]Affiche d'une liste sur plusieurs pages
    Par guillaume_85 dans le forum Struts 1
    Réponses: 3
    Dernier message: 24/06/2005, 20h23
  5. [MFC] Classer une liste a plusieur colonne
    Par Kevgeii dans le forum MFC
    Réponses: 8
    Dernier message: 07/03/2005, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo