Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Irrlicht] Texturer un terrain

Anonyme
    18 mars 2008 à 17:34:44

    Bonsoir,

    J'essaye en ce moment d'écrire une Scene node de terrain, à partir d'une heightmap évidemment.
    Je ne parviens pas à le texturer.
    Lors du rendu, j'ai mis une lumière ambiente mais le terrain reste noir.
    Les paramètres du Material ne semblent pas être pris en compte par le driver video
    lors du rendu (le paramètre Wireframe n'influence pas le rendu, par exemple)

    Voici son code source, vraiment basique :
    1. \*
    2. STerrainMeshSceneNode hérite de ISceneNode
    3. */
    4. void STerrainMeshSceneNode::loadFromHeightMap(video::ITexture *heightMap)
    5.         {
    6.             if(heightMap != NULL)
    7.             {
    8.                 if(heightMap->getSize().Height == heightMap->getSize().Width)
    9.                 {
    10.                     mSize = heightMap->getSize().Height;
    11.                     scene::SMeshBufferLightMap *meshBuffer = new scene::SMeshBufferLightMap;
    12.                     meshBuffer->Vertices.set_used(mSize*mSize);
    13.                     meshBuffer->Indices.set_used(6*mSize*mSize);
    14.                     meshBuffer->Indices.clear();
    15.                     setMaterialFlag(video::EMF_WIREFRAME, true);
    16.                     setMaterialFlag(video::EMF_LIGHTING, true);
    17.                     setMaterialTexture(0, heightMap);
    18.                     video::S3DVertex2TCoords vertex;
    19.                     vertex.Normal.set( 0.0f, 1.0f, 0.0f );
    20.                     vertex.Color = video::SColor(255, 127, 127, 127);
    21.                     void* data = heightMap->lock();
    22.                     if(heightMap->getColorFormat() != video::ECF_A8R8G8B8)
    23.                         throw Exception("terrainSceneNode::loadFromTexture", "Impossible de charger la heightmap : format de couleur invalide.\n");
    24.                     int vertexCount = 0;
    25.                     for(int x = 0; x < mSize; x++)
    26.                     {
    27.                         for(int z = 0; z < mSize; z++)
    28.                         {
    29.                             vertex.Pos.X = (f32)x*2;
    30.                             video::SColor pixelColor(video::SColor(((u32*)data)[x*mSize+z]));
    31.                             vertex.Pos.Y = (f32)pixelColor.getRed()*0.25;
    32.                             vertex.Pos.Z = (f32)z*2;
    33.                             vertex.TCoords.X = vertex.TCoords2.X = x;
    34.                             vertex.TCoords.Y = vertex.TCoords2.Y = z;
    35.                             meshBuffer->Vertices[x*mSize+z] = vertex;
    36.                             vertexCount++;
    37.                             if(x < mSize && z < mSize)
    38.                             {
    39.                                 meshBuffer->Indices.push_back(x*mSize+z);
    40.                                 meshBuffer->Indices.push_back(x*mSize+z+1);
    41.                                 meshBuffer->Indices.push_back((x+1)*mSize+z+1);
    42.                                 meshBuffer->Indices.push_back((x+1)*mSize+z+1);
    43.                                 meshBuffer->Indices.push_back((x+1)*mSize+z);
    44.                                 meshBuffer->Indices.push_back(x*mSize+z);
    45.                             }
    46.                         }
    47.                     }
    48.                     mMeshBuffer = meshBuffer;
    49.                     heightMap->unlock();
    50.                     cout << "Loaded "<<mMeshBuffer->getIndexCount()<<" indices ("<<mMeshBuffer->getVertexCount()<<"x6 = "<<mMeshBuffer->getVertexCount()*6<<")\n";
    51.                 }
    52.                 else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "La texture n'est pas carrée.");
    53.             }
    54.             else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "Texture invalide.");
    55.         }
    56.         void STerrainMeshSceneNode::saveToTexture(video::IImage *heightMap)
    57.         {
    58.         }
    59. /**
    60.  * La méthode de rendu...
    61. */
    62.         void STerrainMeshSceneNode::render()
    63.         {
    64.             if(IsVisible)
    65.                SceneManager->getVideoDriver()->drawMeshBuffer(mMeshBuffer);
    66.         }


    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      21 mars 2008 à 19:39:12

      Bon, en lisant un peu le code source du CTerrainSceneNode de Irrlicht, j'ai pensé qu'il serait bon de faire hériter ma classe de IMeshSceneNode plutôt que de la scene node basique. Je ne le fais pas hériter de ITerrainSceneNode parce quelques trucs ne me conviennent pas. Mais comme je n'ai pas vraiment envie d'implémenter les méthodes de IMeshSceneNode, j'essaye de le faire hériter de CMeshSceneNode.
      Mais malheureusement, il n'y a pas de header dans lequel cette classe est définie (en tout cas il n'est pas installé par défaut, mais il est dans les sources). Est-ce que je copie le header dans mon projet (sachant que l'implémentation doit être dans la lib statique ?) ou il y a une manière plus conventionnelle de régler le problème ?
      • Partager sur Facebook
      • Partager sur Twitter

      [Irrlicht] Texturer un terrain

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown