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 :

Extrusion de surfaces, projection d'ombres, stencil shadow problem, besoin d'aide


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut Extrusion de surfaces, projection d'ombres, stencil shadow problem, besoin d'aide
    Bonjour tout le monde,
    vu la forte experience que presente ce forum et ma longue recherche sur le web pour trouver une soluce a mon problem, je dois vous deranger pendant un petit moment.

    j'ai un stencilshadow shader fait avec du HLSL qui viens avec le moteur Dark Basic Pro ( c le shader( pour l'ombrage ) original du moteur ). Je voudrais que quelcun m'aide a le moddifier.

    Enfait le vertex shader code fait l'extrussion( extrude ) des surfaces et la projection de lombre apartir de la position/direction de la lumiere. Moi, je voudrais qu'il fasse l'extrussion des surfaces a partir de la position/direction de la camera et la projection des ombres apartir de la position/direction de la lumiere. Enfait, moi c que je voudrais c que mes objets animés, projectent de lombre mais quils ne soient pas affectés par leur propre shadows. Peu importe le moyen.
    Je sais qu'il faut juste moddifier le vertex shader code, je ne suis pas capable de le faire, je connais a peine la base du HLSL.
    Voici le code du shader:
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    //--------------------------------------------------------------------------------------
    // Origial File: ShadowVolume.fx
    // Modified: StencilShadow.fx
    //--------------------------------------------------------------------------------------
     
    // DBPro Specific until DXSAS (U6)
    float3   g_vLightView : POINTLIGHT;
    float4x4 g_mWorld : WORLD;
    float4x4 g_mViewProjection : VIEWPROJECTION;
    float4x4 g_mWorldViewProjection : WORLDVIEWPROJECTION;
    float    g_mShadowRange : MESHRADIUS;
     
    // Shader Code
    void VertShadowVolume( float4 vPos : POSITION,
                           float3 vNormal : NORMAL,
                           out float4 oPos : POSITION )
    {
        float4 PosView = mul( vPos, g_mWorld );
        float3 LightVec = PosView.xyz - g_vLightView;
        float3 N = mul( vNormal, (float3x3)g_mWorld );
     
        // Extrude quad vertex if normal faces away from light
        LightVec = normalize ( LightVec );
        if( dot( N, -LightVec  ) < 0.0f )
        {
          // stretch out
          PosView.x += LightVec.x * g_mShadowRange;
          PosView.y += LightVec.y * g_mShadowRange;
          PosView.z += LightVec.z * g_mShadowRange;
        }
        else
        {
          // defeat self-shadow zclash
          PosView.x += LightVec.x*3.0f;
          PosView.y += LightVec.y*3.0f;
          PosView.z += LightVec.z*3.0f;
        }
        oPos = mul( PosView, g_mViewProjection );
    }
     
    //--------------------------------------------------------------------------------------
    // Techniques
    //--------------------------------------------------------------------------------------
     
    technique RenderShadowVolume
    {	
        //Main DBP technique
        /*pass P0
        {
            VertexShader = compile vs_1_1 VertShadowVolume();
            StencilPass = Keep;
            StencilZFail = Incr;
            CullMode     = CCW;
        }
        pass P1
        {
            VertexShader = compile vs_1_1 VertShadowVolume();
            CullMode = Cw;
            StencilZFail = Decr;
        }*/
        //My mod technique
        pass p0
        {   
    		ZEnable = true;
    		ZWriteEnable = true;
    		ZFunc = lessequal;
    		CULLMODE = CW;
    		STENCILENABLE = TRUE;
    		STENCILPASS = DecrSat;
    		STENCILZFAIL = KEEP;
    		ZWRITEENABLE = FALSE;
    		COLORWRITEENABLE = 0;
     
        	VertexShader = compile vs_2_0  VertShadowVolume();
        }
     
        pass p1
        {   
    		ZEnable = true;
    		ZWriteEnable = true;
    		ZFunc = lessequal;
    		CULLMODE = CCW;
    		STENCILENABLE = TRUE;
    		STENCILPASS = INCRsat;
    		STENCILZFAIL = KEEP;
    		STENCILFUNC = ALWAYS;
    		ZWRITEENABLE = FALSE;
    		COLORWRITEENABLE = 0;
     
        	VertexShader = compile vs_2_0  VertShadowVolume();
        }
     
    }
    Je crois que n'importe qui avec un petite experience avec le shadow volumes pourrais le faire sans probleme.
    Est-ce que quelcun pourrais faire cette petite mod pour moi S.V.P?
    EDIT: C'est drole, je suis inscris ici depuis 3 ans et c'est mon premier message... ^^
    @+ et merci d'avance pour votre aide.

  2. #2
    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
    Citation Envoyé par TATOFOREVER
    Moi, je voudrais qu'il fasse l'extrussion des surfaces a partir de la position/direction de la camera et la projection des ombres apartir de la position/direction de la lumiere.
    .
    La c'est carrement pas clair ! Est ce que tu veux faire comme ci la camera etait elle meme une lumiere ? Dans ce cas, il suffit juste de faire la meme chose en deplacant la position de la lumiere pour qu elle corresponde a celle de la camera. Par contre ca n a pas franchement d interet puisque les ombres generes seront systematiquement masques par les objets que tu affiches -> conclusion on ne voit aucune ombre.



    Citation Envoyé par TATOFOREVER
    Enfait, moi c que je voudrais c que mes objets animés, projectent de lombre mais quils ne soient pas affectés par leur propre shadows. Peu importe le moyen.
    Si je comprends ton probleme, tu veux faire un objet qui ne recoit aucune ombre, mais capable lui meme d en projeter sur les autres objets. Ce probleme n est pas trivial. Pour le shadow volume, tu utilises le stencil buffer, et pour empeche l affichage d un objet (une ombre par exemple) tu utilises aussi le stencil buffer



    Sans longue reflection je proposerais l aglo suivant:

    1 - affichage des objets (initialise le depth buffer pour l etape suivante)

    2 - affichage des shadow volumes (initialise le stencil buffer : valeur = 0 -> pas d ombre)

    3 - on supprime les ombres sur les objets que l on veut ignorer. pseudo reaffichage des objets.

    COLORWRITEENABLE = false
    STENCILENABLE = TRUE;
    STENCILFUNC = ALWAYS;
    STENCILREF = 0; // <- a verifier
    STENCILPASS = "SET"; // j ai pas le flag, mais l idee c est de mettre le stencil a 0

    A la fin des 3 etapes, tu as sur le stencil 0 si il n y a pas d'ombre.
    Lors du dessin du shadow

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    Oki, ce que tu proposses la, c dans les techniques?
    J'ai du mal a suivre tes 3 etapes. Pourrais tu aclaircir un peu?
    Le shader que tu vois la, recois la geometrie, les coordonees et tout a l'interne. Il apartient au moteur.
    Donc, si je comprends bien, je pourrais faire mon truc dans les techniques?
    Est-ce que tu pourrais editer le shader et m'expliquer au fur et a mesure?
    Merci,
    @+

  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
    Il faut eviter la confusion sur le terme PASS : on le trouve en general pour deux contexts differents:

    - au niveau des techniques de shaders

    - au niveau du code C


    au niveau du code C, c 'est assez simple, on rend plusieurs fois la meme scene de suite.

    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
     
    void render_voiture_xx(){
     
      set_technique(...);
     
      glBegin();
     
        ...
     
      glEnd();
    }
     
    void render_scene(){
     
      render_voiture1();
     
      render_voiture2();
     
      render_voiture3();
     
    }
     
    void render_multipass(){
     
      set_pass_parameter1();
     
      render_scene();
     
      set_pass_parameter2();
     
      render_scene();
     
      set_pass_parameter3();
     
      render_scene();
     
    }

    dans une technique, quand tu envois au GPU un batch( glBegin() ... glEnd() ) il va afficher tous les polygones de ce batch une fois par passe qu il defini.


    Dans l aglo que je propose,

    la premiere passe rend tous les objets normalement,

    la seconde rend les objets extrudes (shadow volumes) qui sont donc pas les memes que dans la premiere passe. Je parle donc bien de passes au niveau C (car quand un GPU recoit un batch, il va appliquer SES diverses passe sur la MEME geometry, le GPU n a pas la notion d objets)



    L algo C que je propose va donc faire 3 affichages de la scene, et a chaque fois, va utiliser une technique d'une seule passe.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    J'attendais la réponse de samshy pour être sur qu'il n'allait pas nous sortir une technique miracle...

    Je sais qu'il faut juste moddifier le vertex shader code
    A mon avis non.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    @samshy
    Je comprends pas grand chose a ce que tu viens de citer.
    Mais bon, pas grav ^^.
    Je crois que si on moddifie la technique, ca va regler mon probleme.

    @tout le monde,
    jai encore un outre probleme,
    si jutilice les 2 premieres passes, jai optien ca:

    et si jutilice les deux dernieres passes, joptiens ca:

    ??? Vous pouvez maider svp?
    @+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    Alors?
    Il n'y a pas un maitre Jedi quelque pars caché qui urais la force de m'aider? et de trouver une technique a propiée a mon problem?
    Si vous remarques dans RenderMonkey, le shadow volume, il y a une sphere qui projecte de lombre sur les outres objets, mais elle n'est jamais affecte par son propre ombre. Je voudrais un truc semblable...
    Est-ce possible de copier leur technique dans mon shader? ou je dois moddifier encore doutres trucs la?
    Merci chers gourus
    @+

Discussions similaires

  1. framework pour ombre portee shadow mapping
    Par mapmip dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 30/07/2014, 12h07
  2. tracé de surfaces et projection
    Par chabacano dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/08/2009, 09h44
  3. Projection de point sur surface paramétrée
    Par Piairo dans le forum Mathématiques
    Réponses: 10
    Dernier message: 21/01/2009, 17h51
  4. Shadow volume : ombre sur l'obj
    Par zenux dans le forum OpenGL
    Réponses: 8
    Dernier message: 18/06/2007, 13h00
  5. Contenir une ombre ds un plan : PB DE STENCIL !
    Par Muetdhiver dans le forum OpenGL
    Réponses: 6
    Dernier message: 11/03/2004, 12h34

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