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

DirectX Discussion :

Opérations sur les textures dans pixels shader


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut Opérations sur les textures dans pixels shader
    Bonjour,

    j'espère que vous pourrez m'aiguiller sur le problème suivant, je cherche à réaliser des opérations sur une texture passée à mon pixel shader.
    Je cherche par à sommer tous les valeurs R des texels de la texture et à écrire le résultats en sortie.

    J'ai donc en entrée 1024x1024 valeurs et en sortie 1 valeur.
    J'ai tenté d'utiliser le même principe dont on avait parlé sur les pixels adjacents dans un post précédent, mais étant donnée la taille des textures et les limites que je rencontre avec les instructions du type :

    texture2 = tex2D(gTexture1Sampler, In.TextureUV + float2(1.0f,0.0f));

    je n'arrive pas à obtenir le résultat que je recherche.
    En parcourant de la documentation sur le net, je vois qu'il est possible a priori de faire ce que je recherche avec plusieurs passes...
    Il y a d'ailleurs cet exemple avec les produits matriciels comme illustrer dans la pièce jointe. Cet exemple repose sur le principe suivant :

    Pass1
    Output = ax1 * b1y + ax2 * b2y +… + axb * bby
    …..

    Passes: = n/Blockssize

    Now there is a tradeoff between passes and program size/fetches
    j'ai trouvé ces informations à l'adresse
    http://www.seas.upenn.edu/~cis665/Ma...nsontheGPU.ppt

    mais je n'arrive pas à les utiliser.

    1. Pourriez vous me renseigner sur les passes :
    a. est-il possible d'utiliser le résultat d'une passes dans une autres passe ?
    b. si oui, comment faire ?

    2. Comment gérer les passes au niveau du pixel shader ?

    3. Evidemment si quelqu'un a un exemple de code source proche de ce que je souhaite réaliser et qu'il souhaite le partager, je lui serai très reconnaissant.

    Merci d'avance.
    Images attachées Images attachées  

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut langage et environnement
    j'ai oublié de préciser dans mon premier post :

    je travaille avec DirectX 9.0c, une carte graphique qui supporte les shader 3.0 et je code avec HLSL et C++...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut passes dans un pixel shader
    ..bien je vois que ce sujetne rencontre pas beaucoup de succès.

    dommage car je suis bien embêté.

    quelqu'un a-t-il au moins une idée de comment faire pour cumuler un résultat dans un float lors de l'utilisation de plusieur passses dans un pixel shader ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Pour faire un rendu multi-passe, il te faut des rendus successifs dans des textures de plus en plus petites. Tu utilises la texture en sortie (mot cle = render target) d une passe dans l entree d une passe suivante. Dans ton shader, tu peux faire quelque chose comme :

    sampler2D t1;

    float4 col =

    tex2D( t1 , tex_coord + delta_texcoord * float2( 1.0, 0.0) ) +
    tex2D( t1 , tex_coord + delta_texcoord * float2(-1.0, 0.0) ) +
    tex2D( t1 , tex_coord + delta_texcoord * float2( 0.0, 1.0) ) +
    tex2D( t1 , tex_coord + delta_texcoord * float2( 0.0,-1.0) );


    ce qui te permet d accumuler les texels adjacants dans une texture. Par exemple si ta texture en entree fait 1024x1024 alors

    texcoord.x = texcoord.y = 1.0 / 1024.0

    note : se pose la question des texels en limite de texture que tu peux resoudre en changeant le WRAP mode de la texture pour border et en placant la couleur BORDER = 0 (desole j ai pas de pseudo-code DX a disposition).

    tu dois donc crees des textures qui puissent etre utilisees comme render target (il existe un flag pour ca je crois)

    createTexture( .... RENDERABLE ... ); /* ou quelque chose du genre */

    et apres tu fais des

    getRenderTarget()

    +

    setRenderTarget()

    +

    texture->getSurface() /* ou quelque chose ressemblant */

    Attention : de memoire, les get/setRenderTarget incrementent les compteurs de referencement (AddRef), il te faut donc prevoir des SubRef adequates.



    Idee a creuser et a tester (j ai jamais essaye):

    -utiliser les possibilites de generation automatique des LOD de textures.

    -Le niveau de taille 1x1 (le plus petit) contient normalement une moyenne de tous les texels de la textures:


    moyenne * taille_x * taille_y = somme des couleurs

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    erreur :

    c est

    delta_texcoord.x = delta_texcoord.y = 1.0 / 1024.0

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut
    d'accord, j'ai crois comprendre le principe.
    je vais essayrer de bosser la dessus.

    merci.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut ...ce n'est pas une question de limite...
    je viens de refaire quelques test et pour une taille de 1024x1024 ça fonctionne sans erreur...

    allez comprendre..

    ça viendrai de ma carte tout bêtement ?

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

Discussions similaires

  1. [XL-2007] Opérations sur les grands nombres dans Q
    Par KenDev dans le forum Contribuez
    Réponses: 4
    Dernier message: 22/03/2011, 04h05
  2. Réponses: 10
    Dernier message: 13/04/2006, 15h54
  3. Réponses: 1
    Dernier message: 06/04/2006, 17h04
  4. [OpenGL/C++] Opérations sur les Textures
    Par Bob.Killer dans le forum OpenGL
    Réponses: 6
    Dernier message: 10/08/2005, 10h27

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