none
HLSL diffuse shader problème quand l'objet éclairé bouge RRS feed

  • Discussion générale

  • Bonjour.

    J'essaye actuellement d'implémenter un simple shader pour un éclairage directionnel par pixel sur un simple terrain. Tout va bien, jusqu'au moment où je translate mon terrain. plus je translate, plus il devient sombre (il se rapproche de la couleur ambiante), que ce soit dans les parties éclairées ou celles à l'opposé de la source de lumière.

    J'ai essayé différents tutos qui me donnent tous le même résultat, je me dis que ça ne doit pas venir du shader, mais comme je débute dans les shaders (une toute petite expérience de GLSL), je n'en suis pas bien sûr. En théorie, avec une lumière directionnelle, même si mon terrain bouge, mais que la source de lumière reste au même endroit, c'est censé ne rien changer étant donné qu'elle n'a en réalité qu'une direction ... ai-je bien raison ?

    voici mon fichier .fx:

    //Variables-------------------------------------------------------------------------------
    float4x4 WorldMatrix;
    float4x4 ViewMatrix;
    float4x4 ProjectionMatrix;
    float4x4 WorldViewProjection;
    
    float3 DiffuseLightDirection = float3(100.0f, 200.0f, 0.0f);
    float4 DiffuseColor = float4(1.0f, 1.0f, 1.0f, 1.0f);
    float4 AmbientColor = float4(0.1f, 0.1f, 0.1f, 1.0f);
    
    //Input/output structures-----------------------------------------------------------------
    struct VertexShaderInput
    {
    	float4 Position : POSITION0;
    	float4 Normal   : NORMAL0;
    };
    
    struct VertexShaderOutput
    {
    	float4 Position : POSITION0;
    	float4 Normal   : TEXCOORD0;
    	float3 LightDir : TEXCOORD1;
    };
    
    //VERTEX SHADER function--------------------------------------------------------------------
    VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
    {
    	VertexShaderOutput output = (VertexShaderOutput)0;
    	
    	output.Normal = normalize(mul(input.Normal, WorldMatrix));
    	output.Position = mul(input.Position, WorldViewProjection);
    	output.LightDir = normalize(DiffuseLightDirection);
    	
    	
    	return output;
    }
    
    //PIXEL SHADER function---------------------------------------------------------------------
    float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
    {
    	return AmbientColor + DiffuseColor * saturate(dot(input.LightDir, input.Normal));
    }

    J'ai volontairement omis la Technique pour ne pas surcharger inutilement. En haut, mon vecteur pour la direction de la lumière est volontairement non normalisé pour tests, mais je le normalise avant de l'envoyer au pixel shader. Maintenant, au niveau du code XNA, il me reste un doute quand je récupère la transformation de mon objet pour la transformer avec la matrice du monde. Dans ma classe "Terrain", j'ai des vecteurs (Vector3) de position et rotation ainsi qu'un float pour l'échelle. et j'ai une simple méthode "GetTransform" que voici:

    private Matrix GetTransform(float scale, Vector3 rotation, Vector3 translation)
    {
        Matrix scaleMat = Matrix.CreateScale(scale);
        Matrix rotMat = Matrix.CreateRotationX(rotation.X) * Matrix.CreateRotationY(rotation.Y) * Matrix.CreateRotationZ(rotation.Z);
        Matrix transMat = Matrix.CreateTranslation(translation);
    
        return scaleMat * rotMat * transMat;
    }

    Je pense que ce code est bon mais est-ce que je le transforme bien avec la matrice du monde en faisant comme ceci?

    Matrix wvp = world * view * projection;
    
    _Effect.Parameters["WorldMatrix"].SetValue(world * primitiveModel.Transform);
    _Effect.Parameters["ViewMatrix"].SetValue(view);
    _Effect.Parameters["ProjectionMatrix"].SetValue(projection);
    _Effect.Parameters["WorldViewProjection"].SetValue(wvp);

    ceci est placé dans ma méthode de dessin juste avant de faire un "passEffect.Apply()". Mon shader est donc bien mis à jour à chaque rendu. Je ne vois vraiment pas ce qui cloche. J'ai vu certains tutos qui utilisaient la matrice inverse transposée dans le shader, mais j'avais le même soucis. Tous ces tutos oublieraient volontairement une partie pour rester simples? J'imagine que ça viens plutôt de chez moi, mais je suis perdu là ... ça fait plusieurs jours que je cherche en vain en testant plusieurs projets avec différents tutos, et toujours le même résultat.

    Merci d'avance pour l'aide que vous pourrez m'apporter afin que je comprenne.

    • Type modifié Aurel Bera vendredi 26 juillet 2013 07:03 disc
    mardi 23 juillet 2013 16:58