Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Moteurs de jeux vidéo > XNA
XNA Forum d'entraide sur le développement avec XNA
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/03/2012, 16h51   #1
Chen norris
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 127
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 127
Points : 105
Points : 105
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
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2012, 17h08   #2
pyros
Membre Expert
 
Homme
Inscription : mars 2011
Messages : 531
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2011
Messages : 531
Points : 1 042
Points : 1 042
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
pyros est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/03/2012, 09h09   #3
Chen norris
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 127
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 127
Points : 105
Points : 105
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
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2012, 02h41   #4
LeGreg
Membre Expert
 
Programmeur
Inscription : août 2002
Messages : 1 048
Détails du profil
Informations personnelles :
Localisation : Etats-Unis

Informations professionnelles :
Activité : Programmeur

Informations forums :
Inscription : août 2002
Messages : 1 048
Points : 1 578
Points : 1 578
Envoyer un message via ICQ à LeGreg
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
LeGreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2012, 17h59   #5
Chen norris
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 127
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 127
Points : 105
Points : 105
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
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2012, 18h16   #6
LeGreg
Membre Expert
 
Programmeur
Inscription : août 2002
Messages : 1 048
Détails du profil
Informations personnelles :
Localisation : Etats-Unis

Informations professionnelles :
Activité : Programmeur

Informations forums :
Inscription : août 2002
Messages : 1 048
Points : 1 578
Points : 1 578
Envoyer un message via ICQ à LeGreg
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
LeGreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2012, 15h30   #7
Chen norris
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 127
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 127
Points : 105
Points : 105
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
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2012, 18h51   #8
LeGreg
Membre Expert
 
Programmeur
Inscription : août 2002
Messages : 1 048
Détails du profil
Informations personnelles :
Localisation : Etats-Unis

Informations professionnelles :
Activité : Programmeur

Informations forums :
Inscription : août 2002
Messages : 1 048
Points : 1 578
Points : 1 578
Envoyer un message via ICQ à LeGreg
Citation:
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
LeGreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h35.


 
 
 
 
Partenaires

Hébergement Web