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 :

[DirectX9/HLSL] Transformation inverse.


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut [DirectX9/HLSL] Transformation inverse.
    Salut,
    J'essaye en ce moment de développer un shader (effect) pour réaliser de l'éclairage (phong blinn) par pixel, bon, il n'y a aucun problème côté shader, le problème se pose du côté de l'application, voici ce qui me perturbe:
    • L'éclairage est calculé dans le repère objet, et la lumière est dans le repère monde.
    • La caméra est dans le repère monde/caméra.


    Ma question est:
    Comment passer du repère monde au repère objet ? (Au départ je croyais qu'il fallait multiplier par l'inverse de la matrice world, mais ça n'a pas l'air d'être tout à fait ça)
    Merci.

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    voici les notations que je vais utiliser :

    L la lumière de coordonnées (xl, yl, zl)
    O l'objet (xo, yo, zo)
    C la caméra (xc, yc, zc)

    pour avoir la position de la lumière par rapport à l'objet :
    L - O = (xl-xo, yl-yo, zl-zo)

    pour avoir la position de la caméra par rapport à l'objet :
    C - O = (xc-xo, yc-yo, zc-zo)

    etc...

    tu n'as plus qu'à passer tout ça à ton shader, et faire les soustractions avec O le point de ton objet que tu es en train de traiter.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Merci pour ta réponse =) mais malheureusement, le problème persiste ...
    Bon, pour faire ça de façon claire, voici l'effect que j'ai écrit (notez que je l'ai ecrit et ré-écrit de plusieurs façons, et depuis plusieurs sources... le résultat est toujours le même: Un éclairage foireux ...)

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    //-------------------------------------------------------
    // PPL effect.
    //-------------------------------------------------------
     
    //-------------------------------------------------------
    // Globals.
    //-------------------------------------------------------
     
    float4x4 g_mWorldViewProj;
    float4x4 g_mWorld;
     
    float3 g_vLightPos;
    float3 g_vEyePos;
     
    float4 g_cMaterialAmbient;
    float4 g_cMaterialDiffuse;
    float4 g_cMaterialSpecular;
     
    float4 g_cLightAmbient;
    float4 g_cLightDiffuse;
    float4 g_cLightSpecular;
     
    texture g_tDiffuseMap;
     
    //-------------------------------------------------------
    // Sampler.
    //-------------------------------------------------------
     
    sampler g_sDiffuseMap =
    sampler_state
    {
    	Texture = <g_tDiffuseMap>;
    	MipFilter = LINEAR;
    	MinFilter = LINEAR;
    	MagFilter = LINEAR;
    };
     
    //-------------------------------------------------------
    // VS & PS struct.
    //-------------------------------------------------------
     
    struct VS_IN
    {
    	float4 position  : POSITION;
    	float2 texCoord0 : TEXCOORD0;
    	float3 normal    : NORMAL;
    };
     
    struct VS_OUT
    {
    	float4 position  : POSITION;
    	float2 texCoord0 : TEXCOORD0;
    	float3 normal    : TEXCOORD1;
    	float3 eyePos    : TEXCOORD2;
    	float3 lightDir  : TEXCOORD3;	
    };
     
    //-------------------------------------------------------
    // Vs
    //-------------------------------------------------------
     
    void main_vs(in VS_IN input, out VS_OUT output)
    {
    	output.position = mul(input.position, g_mWorldViewProj);
    	output.texCoord0 = input.texCoord0;
    	output.normal = mul(input.normal, (float3x3)g_mWorld);
    	float3 vVertex = mul(input.position, g_mWorld);
    	output.eyePos = g_vEyePos - vVertex;
    	output.lightDir = g_vLightPos - vVertex;	
    }
     
    //-------------------------------------------------------
    //Ps
    //-------------------------------------------------------
     
    void main_ps(in VS_OUT input, out float4 color : COLOR)
    {
    	float4 If, Ia, Id, Is;
     
    	Ia = g_cMaterialAmbient * g_cLightAmbient;
     
    	float3 N = normalize(input.normal);
    	float3 L = normalize(input.lightDir);
     
    	float lambert = max(dot(N, L), 0);
     
    	if(lambert > 0)
    	{
    		Id = g_cLightDiffuse * g_cMaterialDiffuse * lambert;
     
    		float3 E = normalize(input.eyePos);
    		float3 R = reflect(-L, E);
     
    		float spec = pow(max(dot(R, E), 0), 1);
     
    		Is = g_cLightSpecular * g_cMaterialSpecular * spec;
     
    		If = Ia + Id + Is;			
    	}	
     
    	color = If * tex2D(g_sDiffuseMap, input.texCoord0);
    };
     
    technique T
    {
    	pass P
    	{
    		VertexShader = compile vs_3_0 main_vs();
    		PixelShader  = compile ps_3_0 main_ps();
    	}
    }
    Voila, et merci d'avance pour votre aide.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Bah si c'est ca.

    Si tu veux passer du repere monde au repere de ton objet, il faut multiplier par l'inverse de la transformée monde (et non local) de ton objet.

    Mais plutot que de calculer une inverse classique qui coute cher, il te suffit d'inverser l'ordre de la rotation et de la translation et d'utiliser la transposée de la rotation (l'inverse d'une matrice orthogonale etant sa transposée) et l'inverse de la translation (-translation).
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  5. #5
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    heu j'ai rien pour tester sous la main mais un truc me chiffonne, dans le vertex shader tu calcules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    output.eyePos = g_vEyePos - vVertex;
    output.lightDir = g_vLightPos - vVertex;
    le problème c'est que quand tu arrives dans le pixel shader, ces 2 infos seront interpolées en perspective alors que c'est seulement la "position" courante du pixel qu'il nous faut en interpolée.

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    //-------------------------------------------------------
    // PPL effect.
    //-------------------------------------------------------
     
    //-------------------------------------------------------
    // Globals.
    //-------------------------------------------------------
     
    float4x4 g_mWorldViewProj;
    float4x4 g_mWorld;
     
    float3 g_vLightPos;
    float3 g_vEyePos;
     
    float4 g_cMaterialAmbient;
    float4 g_cMaterialDiffuse;
    float4 g_cMaterialSpecular;
     
    float4 g_cLightAmbient;
    float4 g_cLightDiffuse;
    float4 g_cLightSpecular;
     
    texture g_tDiffuseMap;
     
    //-------------------------------------------------------
    // Sampler.
    //-------------------------------------------------------
     
    sampler g_sDiffuseMap =
    sampler_state
    {
    	Texture = <g_tDiffuseMap>;
    	MipFilter = LINEAR;
    	MinFilter = LINEAR;
    	MagFilter = LINEAR;
    };
     
    //-------------------------------------------------------
    // VS & PS struct.
    //-------------------------------------------------------
     
    struct VS_IN
    {
    	float4 position  : POSITION;
    	float2 texCoord0 : TEXCOORD0;
    	float3 normal    : NORMAL;
    };
     
    struct VS_OUT
    {
    	float4 position  : POSITION;
    	float2 texCoord0 : TEXCOORD0;
    	float3 normal    : TEXCOORD1;
    	float3 pixPos    : TEXCOORD2;
    };
     
    //-------------------------------------------------------
    // Vs
    //-------------------------------------------------------
     
    void main_vs(in VS_IN input, out VS_OUT output)
    {
    	output.position = mul(input.position, g_mWorldViewProj);
    	output.texCoord0 = input.texCoord0;
    	output.normal = mul(input.normal, (float3x3)g_mWorld);
    	float3 vVertex = mul(input.position, g_mWorld);
    	output.pixPos = vVertex;
    }
     
    //-------------------------------------------------------
    //Ps
    //-------------------------------------------------------
     
    void main_ps(in VS_OUT input, out float4 color : COLOR)
    {
    	float4 If, Ia, Id, Is;
     
    	Ia = g_cMaterialAmbient * g_cLightAmbient;
     
     	float3 lightDir(g_vLightPos);
    	lightDir -= input.pixPos;
     
    	float3 N = normalize(input.normal);
    	float3 L = normalize(lightDir);
     
    	float lambert = max(dot(N, L), 0);
     
    	if(lambert > 0)
    	{
    		Id = g_cLightDiffuse * g_cMaterialDiffuse * lambert;
     
    		float3 eyeDir(g_vEyePos);
    		eyeDir -= input.pixPos;
     
    		float3 E = normalize(eyeDir);
    		float3 R = reflect(-L, E);
     
    		float spec = pow(max(dot(R, E), 0), 1);
     
    		Is = g_cLightSpecular * g_cMaterialSpecular * spec;
     
    		If = Ia + Id + Is;			
    	}	
     
    	color = If * tex2D(g_sDiffuseMap, input.texCoord0);
    };
     
    technique T
    {
    	pass P
    	{
    		VertexShader = compile vs_3_0 main_vs();
    		PixelShader  = compile ps_3_0 main_ps();
    	}
    }

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Merci pour votre aide, j'ai pu enfin réoudre le problème =)

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

Discussions similaires

  1. [QtGui] Transformée inverse de Hough
    Par electrolover49 dans le forum PyQt
    Réponses: 6
    Dernier message: 01/08/2012, 10h30
  2. Transformation inverse d'un fisheye
    Par Infophile dans le forum OpenCV
    Réponses: 0
    Dernier message: 24/05/2012, 22h54
  3. transformation inverse ondelette
    Par harafado dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/12/2008, 17h34
  4. [XML][CSV]Transformer du XML en CSV et inversement !
    Par tgarcia dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 20/11/2006, 16h10
  5. Transformer du DWG en pdf et inversement
    Par Mut dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 15/11/2006, 20h16

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