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 :

Bump mapping


Sujet :

DirectX

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut Bump mapping
    Bonjour,

    J'essaie de faire du bump mapping sur une sphère mais je n'obtients pas l'effet recherché.

    voici le code :


    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
     
     
     
    //création de la texture bump mapping
     
    void CWinStars2View::BumpMapping(LPDIRECT3DTEXTURE9 *m_pBumpTexture,char* NomTexture, float m_fBumpFactor)
    {
    	TCHAR strTexture[512];
    	HRESULT hr;
    	hr=DXUtil_FindMediaFileCch(strTexture,500, NomTexture);
    	if (!FAILED(hr))
    	{
    		LPDIRECT3DTEXTURE9 pHeightMap=NULL;
    		D3DSURFACE_DESC desc;
    		hr = D3DUtil_CreateTexture(_device, strTexture, &pHeightMap);
     
    		if (!FAILED(hr))
    		{
    			pHeightMap->GetLevelDesc(0, &desc);
     
    			int iWidth = desc.Width;
    			int iHeight= desc.Height;
     
    			hr= D3DXCreateTexture(_device, iWidth, iHeight,0,0,D3DFMT_Q8W8V8U8, D3DPOOL_MANAGED, m_pBumpTexture);
     
    			if (!FAILED(hr))
    			{
    				D3DXComputeNormalMap( *m_pBumpTexture, pHeightMap, NULL, 0 , D3DX_CHANNEL_RED, m_fBumpFactor);
    			}
     
    			pHeightMap->Release();
    		}
    	}
    }
     
    //rendu d'un objet Mesh avec un effet bump mapping
     
    void CWinStars2View::RenderBumpMapping(CD3DMesh *a, LPDIRECT3DTEXTURE9 *texture)
    {
    	//Texture de base
    	_device->SetTexture(0, *a->m_pTextures);    						  
     
    	//Bump mapping
    	_device->SetTexture(1, *texture);
     
    	//paramètres du bump mapping
    	_device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
        _device->SetTextureStageState(0, D3DTSS_COLORARG1,D3DTA_TEXTURE);
        _device->SetTextureStageState(0, D3DTSS_COLORARG2,  D3DTA_DIFFUSE);
    	_device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
    	_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
     
        _device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAP);
        _device->SetTextureStageState(1, D3DTSS_COLORARG1,D3DTA_TEXTURE);
        _device->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
     
    	//on dessine l'objet
    	a->GetLocalMesh()->DrawSubset(0);
     
    	//retablissement des paramètres de rendu
        _device->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);
        _device->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_CURRENT);
        _device->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_TEXTURE);
     
        _device->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_MODULATE);
        _device->SetTextureStageState(1,D3DTSS_COLORARG1, D3DTA_CURRENT);
        _device->SetTextureStageState(1,D3DTSS_COLORARG2, D3DTA_TEXTURE);	
     
        _device->SetTexture(0, NULL);
        _device->SetTexture(1, NULL);
    }
    Qu'est-ce qui ne va pas là dedans ?

    Avec mes remerciements,

    Franck

  2. #2
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    C'est pour faire une planete en "relief" ?

    Tu cherches a faire du Dot3 bump ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut Oui
    Oui, c'est pour faire une planète en relief...

    Je voudrais faire du dot 3 si c'est possible mais il me faut prendre en compte l'éclairage.

    J'ai repris les routines de votre livre, j'obtiens une planète "cabossée" mais sans texture....

    Où est le problème ?

    Merci

    Franck

  4. #4
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    Vu que tu fais :

    a->GetLocalMesh()->DrawSubset(0);

    Ceci : *a->m_pTextures

    me semble "louche"...

    Mais il semble que tu utilises pas mal de double pointeurs, alors ???

    Est-ce que les normales sont bien normalisees ?

    Poster un screen ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut
    Voici une image du résultat :



    Le relief en surface est correct mais la sphere semble "trouée" où paraissent les zones noires.
    De plus, pas de texture...

    Est-ce que le problème vient du fait que j'utilise une mesh et non un vertex buffer ?

    J'ai l'impression de mal positionner les textures... Comment attribuer la texture de surface au niveau 1 si on veut rendre un mesh ?

    Merci


    [/img]

  6. #6
    Membre expérimenté

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

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    bump env map ne va pas faire du "dot3" bumpmapping.

    En gros ce que fait bump env map: il transforme la valeur lue depuis la texture par la matrice mise en place par bump env mat et le résultat est pris en compte comme une déplacement (perturbation de petit ordre) pour la lecture de texture du stage suivant.

    Ce que toi tu veux faire est différent. Tu veux appliquer un éclairage variant par pixel et moduler ça avec ta texture diffuse.

    L'éclairage par pixel se calcule avec l'opérateur dot3 qui va lire un vecteur 3d dans une texture de normal maps (RGB chaque composant est une coordonnée de ta normale). Puis cette normale et le vecteur lumière (passée par le TFactor) seront combinées par produit scalaire (dot product) pour calculer l'intensité de l'éclairement (formule de lambert).
    Ce résultat sera ensuite combiné au stage suivant par l'info de couleur diffuse éventuellement encore modulée derrière ou avant par la couleur de la lumière.
    L'inconvénient de cette méthode c'est qu'il faut faire autant de passes que de lumières différentes (addition de la contribution de chaque lumière suivie par la multiplication par la texture finale) ou alors passer aux pixel shaders. Passer aux pixel shaders permet d'avoir un vrai vecteur lumière interpolé convenablement par triangle et de conserver l'information des normales dans un espace tangent plus confortable (en cas de skinning).

    LeGreg

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 68
    Points : 34
    Points
    34
    Par défaut Merci !
    Ca marche. J'ai enfin compris la méthode.
    Excusez-moi, ça a été un peu long

    Le résultat correspond à ce que je voulais...

    Merci à tous pour votre aide....

    Bien amicalement,

    Franck

  8. #8
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    la methode a l'enorme avantage de faire un effet de bump tout a fait correct sur les cartes d'entree de gamme, GF2 et R7000 par exemple, sans avoir a toucher au pixel shaders. C'est le bump-mapping du pauvre, certes mais il donne de bons resultats dans un environement simple. Le probleme est l'eclairage qui est "perdu", mais on peut ruser.

    J'espere que Francky va poster un screen ( qui marche ) de sa planete pour nous le prouver.

Discussions similaires

  1. Raytracing et bump mapping
    Par ydethe dans le forum Moteurs 3D
    Réponses: 5
    Dernier message: 22/06/2007, 14h03
  2. Explication bump mapping
    Par damienlann dans le forum OpenGL
    Réponses: 41
    Dernier message: 06/06/2006, 17h14
  3. Réponses: 4
    Dernier message: 02/03/2006, 21h40
  4. Réponses: 22
    Dernier message: 28/07/2005, 22h37
  5. Comment faire du bump mapping
    Par CladStrife dans le forum DirectX
    Réponses: 7
    Dernier message: 01/01/2004, 06h07

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