Historique des modifications - Message

Message #10870

Sujet: Avoir la main verte (suite)


Type Date Auteur Contenu
Dernière modification 19-10-2012 10:52:20 johnplayer
S3DVertex contient 1 seule coordonnée de texture, il ne faut donc pas utiliser TexCoord1 dans ton shader. Texcoord0 contient les coordonnées de la texture que contient le S3DVertex courant. Tes 2 textures doivent être de même résolution je pense.

Avoir des textures de tailles différentes n'a aucun intérêt dans ton cas (si tes textures ont la même taille ignores cette dernière phrase wink ).

Les textures sont récuperées dans le shader grâce à "register(sX)" avec X, l'indice de la texture dans le material irrlicht.

Vu que tu as un post sur le forum anglais, je mets un lien : post parallèle.

Ensuite, il y a un truc qui me chiffonne. Tu dessines ton hexagone bizarrement. Je créérais une variable membre de "CIrrHexagoneSceneNode" qui s'appellerait irr::scene::SMeshBuffer *mBuffer(SMeshBuffer est un typedef de CMeshBuffer<S3DVertex>). L'avantage de SMeshBuffer, c'est que tu peut accéder librement à tout ses membres.
Et ensuite je ferais un truc du genre :

Code c++ :



/** Methode de construction de l'hexagone:

- repère position :

axe Z
^
|
 --> axe X

- repere coordonnées de texture :

 --> axe U
|
v
axe V

    2 _________  3
     /|       /|\\
    / | tri  / | \\
   /  |  2  /  |  \\
1 /tri|    /   |tri\\ 4
  \\ 1 |   /    | 4 /
   \\  |  / tri |  /
    \\ | /   3  | /
     \\|/_______|/ 
     6          5
Les positions des sommets sont définies par rapport au centre de l'hexagone.(plus facile pour le placement car le centre du node est le centre de l'hexagone)

**/

void CIrrHexagoneSceneNode::createHexagoneBuffer()
{
    // rayon de l'hexagone
    irr::f32 rayon = 100.f;
    // création des 6 vertex
    irr::video::S3DVertex v1,v2,v3,v4,v5,v6;

    irr::f32 rayonCosPIsurTROIS = rayon*cos(PI/3);
    irr::f32 rayonSinPIsurTROIS = rayon*sin(PI/3);

    v1.Pos = irr::core::vector3df(-rayon,0,0);
    v2.Pos = irr::core::vector3df(-rayonCosPIsurTROIS,0,rayonSinPIsurTROIS);
    v3.Pos = irr::core::vector3df(rayonCosPIsurTROIS,0,rayonSinPIsurTROIS);
    v4.Pos = irr::core::vector3df(rayon,0,0);
    v5.Pos = irr::core::vector3df(rayonCosPIsurTROIS,0,-rayonSinPIsurTROIS);
    v6.Pos = irr::core::vector3df(-rayonCosPIsurTROIS,0,-rayonSinPIsurTROIS);

    v1.TCoords = irr::core::vector2df(0.0f ,0.5f);
    v2.TCoords = irr::core::vector2df(0.25f,0.0f);
    v3.TCoords = irr::core::vector2df(0.75f,0.0f);
    v4.TCoords = irr::core::vector2df(1.0f ,0.5f);
    v5.TCoords = irr::core::vector2df(0.75f,1.0f);
    v6.TCoords = irr::core::vector2df(0.25f,1.0f);

    v1.Normal = irr::core::vector3df(0,1,0); // utile pour l'éclairage par la suite
    v2.Normal = irr::core::vector3df(0,1,0);
    v3.Normal = irr::core::vector3df(0,1,0);
    v4.Normal = irr::core::vector3df(0,1,0);
    v5.Normal = irr::core::vector3df(0,1,0);
    v6.Normal = irr::core::vector3df(0,1,0);

    // insertion des 6 vertex dans le buffer
    mBuffer->Vertices.push_back(v1);
    mBuffer->Vertices.push_back(v2);
    mBuffer->Vertices.push_back(v3);
    mBuffer->Vertices.push_back(v4);
    mBuffer->Vertices.push_back(v5);
    mBuffer->Vertices.push_back(v6);

    // insertion des indices dans le buffer (4triangles)
    mBuffer->Indices.push_back(0);mBuffer->Indices.push_back(1);mBuffer->Indices.push_back(5); // tri 1
    mBuffer->Indices.push_back(5);mBuffer->Indices.push_back(1);mBuffer->Indices.push_back(2); // tri 2
    mBuffer->Indices.push_back(5);mBuffer->Indices.push_back(2);mBuffer->Indices.push_back(4); // tri 3
    mBuffer->Indices.push_back(4);mBuffer->Indices.push_back(2);mBuffer->Indices.push_back(4); // tri 4

    // initialisation du material
    mBuffer->Material.Lighting = false;

    // mise en place du shader
    irr::video::IGPUProgrammingServices* pGPU = pDriver->getGPUProgrammingServices();
    MyShaderCallBack* SCB1 = new MyShaderCallBack();
    irr::s32 MT1 = pGPU->addHighLevelShaderMaterialFromFiles( "./Textures/Shaders/dx.hlsl", "vertexMain", irr::video::EVST_VS_1_1,
                                                              "./Textures/Shaders/dx.hlsl", "pixelMain" , irr::video::EPST_PS_1_1,
                                                              SCB1, irr::video::EMT_SOLID);
    SCB1->drop();
   mBuffer->Material.MaterialType((irr::video::E_MATERIAL_TYPE)MT1);

}

void CIrrHexagoneSceneNode::render()
{
    irr::video::IVideoDriver* driver = SceneManager->getVideoDriver();
    driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
    driver->setMaterial(mBuffer->Material);
    driver->drawMeshBuffer(mBuffer);
}



Des modifications sont peut-être à faire car j'ai fait le code de tête. Mais le principe est là, c'est le principal. Ce code utilise les outils mis à disposition par Irrlicht, il est mieux car il te permettra d'activer des fonctionnalités intéressantes comme les VBOs. Enfin, dans le cas où tu mets plusieurs hexagones dans le même buffer.

Edit : petite rectification parce que j'utilise le material du buffer.
Création du message 19-10-2012 10:33:19 johnplayer
S3DVertex contient 1 seule coordonnée de texture, il ne faut donc pas utiliser TexCoord1 dans ton shader. Texcoord0 contient les coordonnées de la texture que contient le S3DVertex courant. Tes 2 textures doivent être de même résolution je pense.

Avoir des textures de tailles différentes n'a aucun intérêt dans ton cas (si tes textures ont la même taille ignores cette dernière phrase wink ).

Les textures sont récuperées dans le shader grâce à "register(sX)" avec X, l'indice de la texture dans le material irrlicht.

Vu que tu as un post sur le forum anglais, je mets un lien : post parallèle.

Ensuite, il y a un truc qui me chiffonne. Tu dessines ton hexagone bizarrement. Je créérais une variable membre de "CIrrHexagoneSceneNode" qui s'appellerait irr::scene::SMeshBuffer *mBuffer(SMeshBuffer est un typedef de CMeshBuffer<S3DVertex>). L'avantage de SMeshBuffer, c'est que tu peut accéder librement à tout ses membres.
Et ensuite je ferais un truc du genre :

Code c++ :



/** Methode de construction de l'hexagone:

- repère position :

axe Z
^
|
 --> axe X

- repere coordonnées de texture :

 --> axe U
|
v
axe V

    2 _________  3
     /|       /|\\
    / | tri  / | \\
   /  |  2  /  |  \\
1 /tri|    /   |tri\\ 4
  \\ 1 |   /    | 4 /
   \\  |  / tri |  /
    \\ | /   3  | /
     \\|/_______|/ 
     6          5
Les positions des sommets sont définies par rapport au centre de l'hexagone.(plus facile pour le placement car le centre du node est le centre de l'hexagone)

**/

void CIrrHexagoneSceneNode::createHexagoneBuffer()
{
    // rayon de l'hexagone
    irr::f32 rayon = 100.f;
    // création des 6 vertex
    irr::video::S3DVertex v1,v2,v3,v4,v5,v6;

    irr::f32 rayonCosPIsurTROIS = rayon*cos(PI/3);
    irr::f32 rayonSinPIsurTROIS = rayon*sin(PI/3);

    v1.Pos = irr::core::vector3df(-rayon,0,0);
    v2.Pos = irr::core::vector3df(-rayonCosPIsurTROIS,0,rayonSinPIsurTROIS);
    v3.Pos = irr::core::vector3df(rayonCosPIsurTROIS,0,rayonSinPIsurTROIS);
    v4.Pos = irr::core::vector3df(rayon,0,0);
    v5.Pos = irr::core::vector3df(rayonCosPIsurTROIS,0,-rayonSinPIsurTROIS);
    v6.Pos = irr::core::vector3df(-rayonCosPIsurTROIS,0,-rayonSinPIsurTROIS);

    v1.TCoords = irr::core::vector2df(0.0f ,0.5f);
    v2.TCoords = irr::core::vector2df(0.25f,0.0f);
    v3.TCoords = irr::core::vector2df(0.75f,0.0f);
    v4.TCoords = irr::core::vector2df(1.0f ,0.5f);
    v5.TCoords = irr::core::vector2df(0.75f,1.0f);
    v6.TCoords = irr::core::vector2df(0.25f,1.0f);

    v1.Normal = irr::core::vector3df(0,1,0); // utile pour l'éclairage par la suite
    v2.Normal = irr::core::vector3df(0,1,0);
    v3.Normal = irr::core::vector3df(0,1,0);
    v4.Normal = irr::core::vector3df(0,1,0);
    v5.Normal = irr::core::vector3df(0,1,0);
    v6.Normal = irr::core::vector3df(0,1,0);

    // insertion des 6 vertex dans le buffer
    mBuffer->Vertices.push_back(v1);
    mBuffer->Vertices.push_back(v2);
    mBuffer->Vertices.push_back(v3);
    mBuffer->Vertices.push_back(v4);
    mBuffer->Vertices.push_back(v5);
    mBuffer->Vertices.push_back(v6);

    // insertion des indices dans le buffer (4triangles)
    mBuffer->Indices.push_back(0);mBuffer->Indices.push_back(1);mBuffer->Indices.push_back(5); // tri 1
    mBuffer->Indices.push_back(5);mBuffer->Indices.push_back(1);mBuffer->Indices.push_back(2); // tri 2
    mBuffer->Indices.push_back(5);mBuffer->Indices.push_back(2);mBuffer->Indices.push_back(4); // tri 3
    mBuffer->Indices.push_back(4);mBuffer->Indices.push_back(2);mBuffer->Indices.push_back(4); // tri 4

    // initialisation du material
    mBuffer->Material.Lighting = false;

    // mise en place du shader
    irr::video::IGPUProgrammingServices* pGPU = pDriver->getGPUProgrammingServices();
    MyShaderCallBack* SCB1 = new MyShaderCallBack();
    irr::s32 MT1 = pGPU->addHighLevelShaderMaterialFromFiles( "./Textures/Shaders/dx.hlsl", "vertexMain", irr::video::EVST_VS_1_1,
                                                              "./Textures/Shaders/dx.hlsl", "pixelMain" , irr::video::EPST_PS_1_1,
                                                              SCB1, irr::video::EMT_SOLID);
    SCB1->drop();
   mBuffer->Material.MaterialType((irr::video::E_MATERIAL_TYPE)MT1);

}

void CIrrHexagoneSceneNode::render()
{
    irr::video::IVideoDriver* driver = SceneManager->getVideoDriver();
    driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
    driver->setMaterial(mBuffer->Material);
    driver->drawMeshBuffer(mBuffer);
}



Des modifications sont peut-être à faire car j'ai fait le code de tête. Mais le principe est là, c'est le principal. Ce code utilise les outils mis à disposition par Irrlicht, il est mieux car il te permettra d'activer des fonctionnalités intéressantes comme les VBOs. Enfin, dans le cas où tu mets plusieurs hexagones dans le même buffer.

Edit : petite rectification parce que j'utilise le material du buffer.

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
229 invités en ligne
membre en ligne: -
RSS Feed