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

OpenGL Discussion :

GLSL : texture lookup trop nombreux, comment faire ?


Sujet :

OpenGL

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut GLSL : texture lookup trop nombreux, comment faire ?
    Bonjour,

    Je rencontre actuellement un problème assez facheux sur ma Radeon 9800 Pro lors de l'écriture d'un shader en GLSL. Je semble effectuer tout ce que les cartes PS2.0 détestent, à savoir : beaucoup de lookups sur des textures, une boucle for et un if :/. Hélas je vois pas comment régler ça. Voici le shader en question :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    varying float dist;
     
    varying vec4 posXY;
     
    uniform vec2 haltonPoints [20];
     
    uniform sampler2DRect PosTextureLight;
    uniform sampler2DRect MatTextureLight;
    uniform sampler2DRect PosCamera;
    uniform sampler2DRect PosNormal;
    uniform sampler2DRect PosMaterials;
     
    void main()
    {
    vec2 pos2 = (posXY.xy) * 0.5 + 0.5;
    pos2.x *= 800.0;
    pos2.y *= 600.0;
     
    		// TODO add specular
    	vec4 final;
    	vec4 indirect;
    	vec4 indirectNeg;
     
    	vec4 n = normalize(texture2DRect(PosNormal, pos2.xy));
    	vec4 position = vec4(texture2DRect (PosCamera, pos2.xy));
    	vec4 diffuse = texture2DRect(PosMaterials, pos2.xy);
     
    	for (int i = 0 ; i != 20 ; ++i)
    {
    	vec4 lightPosition = texture2DRect (PosTextureLight, haltonPoints[i].xy);
    	vec4 lightDiffuse = texture2DRect (MatTextureLight, haltonPoints[i].xy);
    	vec4 toLight = lightPosition - position;
    	float dis = length(toLight);
    	toLight = normalize(toLight);
    	float att;
    	float spotAtt;
     
    	float nDotL= max(0.0, dot(n,toLight));
     
    	if (nDotL > 0.0)
    	{
    		att = 1.0 / (4.0 + 1.0 * dis + 0.25 * dis * dis);
    		final += att * (diffuse * nDotL);
    	}
    }
    	gl_FragColor = final;
    }
    Pour le pos2, c'est parceque le gl_FragCoord est très très mal supporté sur toutes les cartes ATi... Egalement, le vertex shader n'effectue quasiment rien, aucun if, aucune boucle, pas de lookup sur des textures.

    En décommantant la ligne final += att... dans le if de la fin, pas de soucis, ça compile sans soucis en mode hardware. en décommentant cette ligne, misère, les shaders fonctionnent en mode software, et m'indique que le nombre d'instructions sur les textures a été dépassé, alors que bizarrement en décommentant le final += att... qui n'utilise aucune instruction sur des textures, ça fonctionne en mode hardware.

    D'autre part, j'ai fait des tests et ça fonctionne en mode software à partir de i < 5,... or il me faudrait effectuer cette boucle au moins une centaine de fois... Alosr je ne sais pas comment faire. J'ai testé de "dérouler" la boucle à la main et ça fonctionne, mais alors vlà le bordel à gérer et la longueur du shader si je dois exécuter ce code 100 fois...

    Quelqu'un a des techniques pour limiter ce phénomène ? Je ne vois pas comment je pourrais supprimer ces accès aux textures...

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    PSM 2.0 => pas de branchement dynamique, donc que ce soit toi ou le compilo qui déroule la boucle, ce sera la même chose... et en plus, les radeon 9800 on un nombre max d'instruction par shader assez limité il me semble.

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Ouais, c'est ce que j'ai cru comprendre... Ca m'énèrve quand même parceque j'avais l'intention de changer mon PC à la fin de l'année, mais là je vais sûrement devoir le faire avant alors... Parceque coder à "l'aveugle" comme ça, j'ose même pas essayer...

    Ils sont quand même chiants, j'en suis sûr qu'il est possible de gérer ça sur ce genre de cartes par les drivers, mais qu'ils ne le font pas pour vendre leur dernière cartes...

Discussions similaires

  1. Comment faire lorsque la requete est trop longue ?
    Par tabtab dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 26/03/2008, 14h55
  2. Trop de conditions comment faire?
    Par samlepiratepaddy dans le forum Excel
    Réponses: 2
    Dernier message: 24/05/2007, 11h11
  3. JAVA 3D: des objets 3d trop gros, comment faire?
    Par Ayor Archer dans le forum 3D
    Réponses: 3
    Dernier message: 01/03/2007, 18h16
  4. [Conversion]Comment faire pour couper un Double trop long?
    Par dessinateurttuyen dans le forum Général Java
    Réponses: 1
    Dernier message: 13/11/2005, 02h22
  5. comment faire un sphère avec une texture ?
    Par fregate dans le forum OpenGL
    Réponses: 1
    Dernier message: 12/09/2005, 03h37

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