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 :

Heightmap et textures


Sujet :

DirectX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut Heightmap et textures
    Bonjour,

    j'ai généré un terrain à l'aide d'une heightmap, je voudrais y appliquer une texture, mais comment appliquer une texture qui soit "propre" c'est à dire plutôt que d'obtenir quelque chose comme ça :



    je voudrais obtenir ceci :

    .

    Une idée de technique à utiliser?

    Merci de vos réponse.

  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
    bonjour,

    déjà utiliser une texture de meilleure qualité, car elle ne casse pas vraiment des briques.

    ensuite des techniques comme l'ombrage, le bump map.

  3. #3
    Membre expérimenté Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Par défaut
    sur la première image c'est simplement une texture étiré sur tout le terrain, sur la seconde du texture splatting.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut
    Citation Envoyé par ShadowTzu Voir le message
    sur la première image c'est simplement une texture étiré sur tout le terrain, sur la seconde du texture splatting.
    Merci c'est ce que je viens de voir sur un article. Par contre comment calculer correctement les coordonnées de textures pour une texture qui va se répéter sur mon terrain?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut
    J'ai réussi à plaquer correctement ma texture par contre bizarrement elle n'a pas la même couleur que sur l'image d'origine je comprend pas. Une idée?

  6. #6
    Membre expérimenté Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Par défaut
    déjà il faut passé par un shader, ensuite soit c'est par hauteur des vertices soit en utilisant une texture avec un code de couleur (appelé alphamap)

    Si c'est du rouge, tel texture, vert une autre, etc..


    coté code HLSL cela donne par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //BaseCoord = coordonnée etiré sur tout le terrain
    //splat_texcoord = coordonnée répété x fois
    //a = Alphamap
    float4  a = tex2D(SamplerAlpha, BaseCoord);
    float4  b = tex2D(SamplerSand, splat_texcoord);
     
    b = (a.r * tex2D(SamplerGrass, splat_texcoord)) + ((1.0f - a.r) * b);
    b = (a.g * tex2D(SamplerRock, splat_texcoord)) + ((1.0f - a.g) * b);
    b = (a.b * tex2D(SamplerSnow, splat_texcoord)) + ((1.0f - a.b) * b);
    Color = b;

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut
    Merci, j'ai une texture comme ceci :



    et lorsque je l'applique sur mon terrain j'obtiens ceci :



    Je ne comprend pas pourquoi je n'obtiens pas la même couleur que sur la texture.

  8. #8
    Membre expérimenté Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Par défaut
    niveau code cela donne quoi?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut
    J'utilise DXUT, j'ai une structure scene comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Scene {
    	ID3D11ShaderResourceView *pSrv;
    	ID3D11SamplerState *pSS;
    	Scene() { memset(this,0,sizeof(Scene)); };
    };
    Je crée ensuite le sampler state dans la callback OnCreateDevice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            // création de la configuration d'un SamplerState
    	CD3D11_DEFAULT default;
    	CD3D11_SAMPLER_DESC sd(default);
    	sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
    	sd.AddressU = sd.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
    	_V(device->CreateSamplerState( &sd, &s.pSS ));
    	DXUTGetD3D11DeviceContext()->VSSetSamplers( 0, 1, &s.pSS  );
    	DXUTGetD3D11DeviceContext()->PSSetSamplers( 0, 1, &s.pSS  );
    	ID3D11Resource *pRes = NULL;
    	// chargement de la texture
    	_V( D3DX11CreateTextureFromFileA(device, "media/terre.dds", NULL, NULL, &pRes, NULL) );
    	_V( device->CreateShaderResourceView(pRes, NULL, &s.pSrv) );
    	SAFE_RELEASE(pRes);
    et dans la callback OnFrameRender je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ID3D11ShaderResourceView *pSRVarray[1] = { s.pSrv};
    	context->VSSetShaderResources(0,1,pSRVarray);
    	context->PSSetShaderResources(0,1,pSRVarray);
    puis dans mon shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Texture2D t:register(t0);
    SamplerState s:register(s0);
    ...
    // ici code du vertex shader
    ...
    float4 PSmain( PSin Pin ) : SV_Target { 
    	float4 c = t.Sample(s,Pin.uv);
    	return float4( c.rgb, 1);
    };

  10. #10
    Membre expérimenté Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Par défaut
    je vois pas, désolé, je n'ai jamais touché à DX11

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut
    Problème résolu, apparemment DXUT active la correction gamma il suffit de rajouter cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DXUTSetIsInGammaCorrectMode(false);
    Merci encore ShadowTzu.

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

Discussions similaires

  1. [OpenGL 3.x] Multi-texturing heightmap
    Par swain.dakota dans le forum OpenGL
    Réponses: 4
    Dernier message: 20/07/2013, 00h49
  2. [openGL] heightmap: vbo + texturing
    Par orochimaru dans le forum OpenGL
    Réponses: 4
    Dernier message: 16/12/2011, 17h14
  3. Chargement d'une texture a partir de la mémoire
    Par logramme dans le forum DirectX
    Réponses: 6
    Dernier message: 27/01/2003, 14h57
  4. Mosaïque texturée
    Par Pode dans le forum OpenGL
    Réponses: 5
    Dernier message: 19/09/2002, 09h50
  5. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31

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