Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre habitué Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : avril 2008
    Messages : 170
    Points : 140
    Points
    140

    Par défaut Lumière ambiante

    Bonjour,

    J'essaie d'utiliser la lumière ambiante pour colorer des vertices.
    Quoi que je fasse, soit le rendu est blanc, soit il est noir.
    Il y a un autre message qui parle du même problème sur le forum, mais je n'arrive pas à en tirer d'information pour résoudre mon problème.

    Je suis parti du programme d'exemple "Vertices" du SDK DirectX.
    Dans l'init, je met toutes les couleurs du VertexBuffer à blanc
    Code :
    1
    2
    3
    4
    5
    6
    7
     
        CUSTOMVERTEX Vertices[] =
        {
            { 150.0f,  50.0f, 0.5f, 1.0f, 0xffffffff, }, // x, y, z, rhw, color
            { 250.0f, 250.0f, 0.5f, 1.0f, 0xffffffff, },
            {  50.0f, 250.0f, 0.5f, 1.0f, 0xffffffff, },
        };
    Ensuite, j'active la prise en compte de la lumière:

    Code :
    1
    2
     
        g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
    Puis j'initialise un light, un material et une couleur ambiante :

    Code :
    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
     
        g_pLight0.Type = D3DLIGHT_DIRECTIONAL;
        g_pLight0.Direction = D3DXVECTOR3( 1.0f, 0.0f, 1.0f );
     
        g_pLight0.Diffuse.r = 1.0f;
        g_pLight0.Diffuse.g = 1.0f;
        g_pLight0.Diffuse.b = 1.0f;
        g_pLight0.Diffuse.a = 1.0f;
     
        g_pLight0.Specular.r = 1.0f;
        g_pLight0.Specular.g = 1.0f;
        g_pLight0.Specular.b = 1.0f;
        g_pLight0.Specular.a = 1.0f;
     
        g_pd3dDevice->SetLight( 0, &g_pLight0 );
        g_pd3dDevice->LightEnable( 0, TRUE );
     
        ZeroMemory( &mtrl, sizeof(mtrl) );
        mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
        mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
        mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
        mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
     
        g_pd3dDevice->SetMaterial( &mtrl );
        g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xFFFF20FF );
    et là, rien... Je reste désespérément avec un triangle blanc dans la fenêtre.

    J'ai essayé en désactivant les COLORVERTEX, ou en mettant tous les xxxMATERIALSOURCE à D3DMCS_MATERIAL, parce que j'ai trouvé ça dans un tuto (dx9_materials sur un des sites donné dans un post du forum)
    Code :
    1
    2
    3
    4
    5
    6
    7
     
        g_pd3dDevice->SetRenderState( D3DRS_COLORVERTEX, FALSE );
    ...
            g_pd3dDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL );
            g_pd3dDevice->SetRenderState( D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL );
            g_pd3dDevice->SetRenderState( D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL );
            g_pd3dDevice->SetRenderState( D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL );
    Mais rien n'y fait.
    Qu'est-ce que j'ai oublié ?

  2. #2
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    août 2002
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : août 2002
    Messages : 1 055
    Points : 1 441
    Points
    1 441

    Par défaut

    Toutes les équations liées à la lumière dans DirectX sont là :
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Sinon, les modèles d'éclairage "fixes" sont de moins en moins utilisés dans les jeux et tout se fait par shaders (même si les formules de bases peuvent rester les mêmes).

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  3. #3
    Membre habitué Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : avril 2008
    Messages : 170
    Points : 140
    Points
    140

    Par défaut

    Merci,

    J'ai déjà parcouru pas mal de doc et de tutos, mais je n'ai rien trouvé pour résoudre mon problème.

    Le besoin initial, c'est que j'ai un VertexBuffer qui contient des données à afficher sous forme de points ou de lignes, et dont la couleur peut varier. Mais tous les points du buffer sont de la même couleur. Donc au lieu de préciser la couleur pour chacun, j'aurais préféré un moyen global de le faire.

    Comme je n'arrive pas à le faire avec les lights, je l'ai fait autrement : J'ai décomposé mon VertexBuffer en 2, un qui contient les coordonnées des points, et un autre qui contient les couleurs.
    Ensuite, j'utilise les streams 0 et 1 pour dessiner mes points.
    C'est pas très beau, puisque mon VertexBuffer de couleur contient tout le temps la même chose.
    J'ai essayé en mettant le stride à 0 quand j'initialise le stream 1 pour le rendu, mais ça ne semble pas marcher.

    Y'a-t-il un meilleur moyen de faire ?

    Merci

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •