Historique des modifications - Message

Message #3701

Sujet: Texturer un terrain


Type Date Auteur Contenu
Dernière modification 18-03-2008 16:26:18 wetneb
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 :
\\*
STerrainMeshSceneNode hérite de ISceneNode
*/

void STerrainMeshSceneNode::loadFromHeightMap(video::ITexture *heightMap)
        {
            if(heightMap != NULL)
            {
                if(heightMap->getSize().Height == heightMap->getSize().Width)
                {
                    mSize = heightMap->getSize().Height;

                    scene::SMeshBufferLightMap *meshBuffer = new scene::SMeshBufferLightMap;
                    meshBuffer->Vertices.set_used(mSize*mSize);
                    meshBuffer->Indices.set_used(6*mSize*mSize);
                    meshBuffer->Indices.clear();

                    setMaterialFlag(video::EMF_WIREFRAME, true);
                    setMaterialFlag(video::EMF_LIGHTING, true);
                    setMaterialTexture(0, heightMap);

                    video::S3DVertex2TCoords vertex;
                    vertex.Normal.set( 0.0f, 1.0f, 0.0f );
                    vertex.Color = video::SColor(255, 127, 127, 127);

                    void* data = heightMap->lock();
                    if(heightMap->getColorFormat() != video::ECF_A8R8G8B8)
                        throw Exception("terrainSceneNode::loadFromTexture", "Impossible de charger la heightmap : format de couleur invalide.\
");

                    int vertexCount = 0;
                    for(int x = 0; x < mSize; x++)
                    {
                        for(int z = 0; z < mSize; z++)
                        {
                            vertex.Pos.X = (f32)x*2;
                            video::SColor pixelColor(video::SColor(((u32*)data)[x*mSize+z]));
                            vertex.Pos.Y = (f32)pixelColor.getRed()*0.25;
                            vertex.Pos.Z = (f32)z*2;

                            vertex.TCoords.X = vertex.TCoords2.X = x;
                            vertex.TCoords.Y = vertex.TCoords2.Y = z;

                            meshBuffer->Vertices[x*mSize+z] = vertex;
                            vertexCount++;

                            if(x < mSize && z < mSize)
                            {
                                meshBuffer->Indices.push_back(x*mSize+z);
                                meshBuffer->Indices.push_back(x*mSize+z+1);
                                meshBuffer->Indices.push_back((x+1)*mSize+z+1);

                                meshBuffer->Indices.push_back((x+1)*mSize+z+1);
                                meshBuffer->Indices.push_back((x+1)*mSize+z);
                                meshBuffer->Indices.push_back(x*mSize+z);
                            }
                        }
                    }
                    mMeshBuffer = meshBuffer;

                    heightMap->unlock();
                    cout << "Loaded "<<mMeshBuffer->getIndexCount()<<" indices ("<<mMeshBuffer->getVertexCount()<<"x6 = "<<mMeshBuffer->getVertexCount()*6<<")\
";
                }
                else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "La texture n'est pas carrée.");
            }
            else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "Texture invalide.");
        }

        void STerrainMeshSceneNode::saveToTexture(video::IImage *heightMap)
        {

        }

/**
 * La méthode de rendu...
*/

        void STerrainMeshSceneNode::render()
        {
            if(IsVisible)
               SceneManager->getVideoDriver()->drawMeshBuffer(mMeshBuffer);
        }

Merci !
Création du message 17-03-2008 19:44:58 wetneb
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 :
\\*
STerrainMeshSceneNode hérite de ISceneNode
*/

void STerrainMeshSceneNode::loadFromHeightMap(video::ITexture *heightMap)
        {
            if(heightMap != NULL)
            {
                if(heightMap->getSize().Height == heightMap->getSize().Width)
                {
                    mSize = heightMap->getSize().Height;

                    scene::SMeshBufferLightMap *meshBuffer = new scene::SMeshBufferLightMap;
                    meshBuffer->Vertices.set_used(mSize*mSize);
                    meshBuffer->Indices.set_used(6*mSize*mSize);
                    meshBuffer->Indices.clear();

                    setMaterialFlag(video::EMF_WIREFRAME, true);
                    setMaterialFlag(video::EMF_LIGHTING, true);
                    setMaterialTexture(0, heightMap);

                    video::S3DVertex2TCoords vertex;
                    vertex.Normal.set( 0.0f, 1.0f, 0.0f );
                    vertex.Color = video::SColor(255, 127, 127, 127);

                    void* data = heightMap->lock();
                    if(heightMap->getColorFormat() != video::ECF_A8R8G8B8)
                        throw Exception("terrainSceneNode::loadFromTexture", "Impossible de charger la heightmap : format de couleur invalide.\
");

                    int vertexCount = 0;
                    for(int x = 0; x < mSize; x++)
                    {
                        for(int z = 0; z < mSize; z++)
                        {
                            vertex.Pos.X = (f32)x*2;
                            video::SColor pixelColor(video::SColor(((u32*)data)[x*mSize+z]));
                            vertex.Pos.Y = (f32)pixelColor.getRed()*0.25;
                            vertex.Pos.Z = (f32)z*2;

                            vertex.TCoords.X = vertex.TCoords2.X = x;
                            vertex.TCoords.Y = vertex.TCoords2.Y = z;

                            meshBuffer->Vertices[x*mSize+z] = vertex;
                            vertexCount++;

                            if(x < mSize && z < mSize)
                            {
                                meshBuffer->Indices.push_back(x*mSize+z);
                                meshBuffer->Indices.push_back(x*mSize+z+1);
                                meshBuffer->Indices.push_back((x+1)*mSize+z+1);

                                meshBuffer->Indices.push_back((x+1)*mSize+z+1);
                                meshBuffer->Indices.push_back((x+1)*mSize+z);
                                meshBuffer->Indices.push_back(x*mSize+z);
                            }
                        }
                    }
                    mMeshBuffer = meshBuffer;

                    heightMap->unlock();
                    cout << "Loaded "<<mMeshBuffer->getIndexCount()<<" indices ("<<mMeshBuffer->getVertexCount()<<"x6 = "<<mMeshBuffer->getVertexCount()*6<<")\
";
                }
                else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "La texture n'est pas carrée.");
            }
            else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "Texture invalide.");
        }

        void STerrainMeshSceneNode::saveToTexture(video::IImage *heightMap)
        {

        }

/**
 * La méthode de rendu...
*/

        void STerrainMeshSceneNode::render()
        {
            if(IsVisible)
               SceneManager->getVideoDriver()->drawMeshBuffer(mMeshBuffer);
        }

Merci !

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
113 invités en ligne
membre en ligne: -
RSS Feed