Historique des modifications - Message

Message #3701

Sujet: Texturer un terrain


TypeDateAuteurContenu
Dernière modification18-03-2008 16:26:18wetneb
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 message17-03-2008 19:44:58wetneb
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

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
86 invités en ligne
membre en ligne: -
RSS Feed