+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Membre habitué Avatar de Chen norris
    Profil pro
    Inscrit en
    mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2004
    Messages : 127
    Points : 108
    Points
    108

    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 :
    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 :
    ??? 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 Expert
    Homme Profil pro
    Inscrit en
    mars 2011
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 542
    Points : 1 167
    Points
    1 167

    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 habitué Avatar de Chen norris
    Profil pro
    Inscrit en
    mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2004
    Messages : 127
    Points : 108
    Points
    108

    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 Expert

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

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : août 2002
    Messages : 1 055
    Points : 1 600
    Points
    1 600

    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 habitué Avatar de Chen norris
    Profil pro
    Inscrit en
    mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2004
    Messages : 127
    Points : 108
    Points
    108

    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 Expert

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

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : août 2002
    Messages : 1 055
    Points : 1 600
    Points
    1 600

    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 habitué Avatar de Chen norris
    Profil pro
    Inscrit en
    mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2004
    Messages : 127
    Points : 108
    Points
    108

    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 :
    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 :
    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 Expert

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

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : août 2002
    Messages : 1 055
    Points : 1 600
    Points
    1 600

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •